Dockerfile指令

本文详细解析Dockerfile中的关键指令,如FROM、LABEL、COPY、ADD、WORKDIR、VOLUME、EXPOSE、ENV、RUN、CMD、ENTRYPOINT、USER、HEALTHCHECK、SHELL、STOPSIGNAL、ARG、ONBUILD等,帮助读者理解各指令的功能及使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 FROM

     FROM指令最为重要,必须为Dockerfile文件开篇的第1个非注释行,用于为镜像文件构建过程中指定基准镜像

Syntax

   FROM <repository>[:<tag>]

   FROM <repository>@<digest>

 

LABLE

   指定镜像的元数据,使用键值对来表示

 Syntax

     LABLE  <key>=<value>

 

COPY

    Copy指令用于从主机复制文件到新创建的镜像文件

 Syntax

     COPY <src> ... <dst>

     COPY ["<src>" ... "<dst>"]     

            -----建议dst使用绝对路径,否则以WORKDIR为起始路径

            -----如果路径中有空白字符,则使用第二种方式

文件复制准则

  <src>必须是build上下文中的路径,不能是父目录中的文件

  如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制    ---- 相当于  copy -r src/*

  如果指定了多个<src>或在<src>中使用通配符,则dst必须是一个目录,且必须以 / 结尾

  如果dst事先不存在,他将会被自动创建,包括其父目录

 

ADD

 ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径

 Syntax

     ADD <src> ... <dst>

     ADD ["<src>" ... "<dst>"]     

操作准则,

   同COPY指令

   如果<src>为url,且<dst>不以 / 结尾,则<src>被下载并创建为<dst>

   如果<src>为url,且<dst>以 / 结尾,则<src>被下载并创建为<dst>/<filename>

   如果<src>是本地系统上的压缩格式tar文件,它将被展开为目录     ---- 相当于  tar -x

   如果<src>是网络系统上的压缩格式tar文件,它将不会被展开

 

WORKDIR

  用于为RUN、CMD、ENTRYPOINT、COPY、ADD设定工作目录

  WORKDIR可以出现多次,也可以调用由ENV定义的变量

 

VOLUME

   用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷

 Syntax

     VOLUME <mountpoint>

    如果挂载点目录路径下,此前的文件存在,docker run命令会在卷挂载完成后将此前所有文件复制到新挂载的卷中

 

EXPOSE

  用于为容器打开指定要监听的端口(待暴露端口,待docker run时,-P将其暴露)

 Syntax

     EXPOSE <port>[/<protocol>]  [<port>[/<protocol>]...]

  EXPOSE只能指定端口不能指定地址,不能指定宿主机端口(显然)

  例如:

     EXPOSE  12345/tcp  12345/udp

 

ENV

  用于定义环境变量,并被其后的命令(ENV、COPY、ADD等)所调用

  调用格式为 $variable_name 或 ${variable_name}

 Syntax

   ENV <key> <value>           ----定义一个变量 第一个空白字符之后的通通为value,value可加引号

   ENV <key>=<value> ...      ----定义多个变量  value可加引号

 

RUN

 Dockerfile构建镜像时(docker build)运行的命令 (此命令,基础镜像必须提供)

 RUN可运行多次,但建议尽量运行在一行以减少镜像层数

CMD

  将镜像启动为容器时的默认命令

 Syntax

    CMD  <command>                                                   ----默认使用"/bin/sh -c"解析

    CMD ["<executable>","<param1>","<param2>"]     ----默认使用内核解析

    CMD ["<param1>","<param2>"]                              ----将参数传递给后续的ENTRYPOINT

ENTRYPOINT

  将镜像启动为容器时的默认命令,与CMD不同的是,ENTRYPOINT命令不能被docker run后的内容覆盖,

且docker run后面的内容将作为参数传递给ENTRYPOINT

 

USER

用于指定运行程序的用户名或OID,默认container运行身份为root

 Syntax

     USER <UID> | <UserName>

    注意,UID或UserName必须为容器中存在的用户

   

HEALTHCHECK

   指定容器中检测自身健康状态的指令,比如检测webserver是否能够正常提供服务(叫做正常),而不是该容器是否正在运行(叫做正常)

HEALTHCHECK

     --interval=DURATION (default:30s)

     --timeout=DURATION (default:30s)

     --start-period=DURATION (default:0s)

     --retries=N (default:3)

 命令的退出状态表示容器的健康状态

   0:success

   1:unhealthy

   2:reserved

示例:

  HEALTHCHECK --interval=5m --timeout=3s  \

    CMD curl -f http://localhost/ || exit 1

 

SHELL

  覆盖命令的shell模式所使用的默认shell

 

STOPSIGNAL

默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s

Syntax

    STOPSIGNAL signal

 

ARG

   ARG指令用以定义构建镜像时需要的参数

Syntax   

    ARG a_name
    ARG a_nother_name=a_default_value

    在docker build命令中以--build-arg a_name=a_value形式赋值

 

ONBUILD 

    ONBUILD指令可以为镜像添加触发器。其参数是任意一个Dockerfile 指令

    当我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。需要注意的是,如果是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效。

示例:

FROM ubuntu
MAINTAINER hello
ONBUILD RUN mkdir mydir

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值