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