Dockerfile指令解析

本文主要记录Dockerfile指令的使用方式

Dockerfile指令

RUN 运行命令
COPY 复制文件
ADD 复制文件并解压
CMD 容器启动命令
ENRTYPOINT 容器启动入口点
ENV 设置环境变量
ARG 构建参数
VOLUME 指定匿名卷
EXPOSE 声明暴露端口
WORKDIR 指定工作目录
USER 指定当前用户
HEALTHCHECK 健康检查
ONBUILD 以当前镜像为基础镜像构建下一级镜像时执行具体指令

RUN 运行命令

指令格式:

1
RUN <命令>

RUN指令很好理解,就是在镜像内执行命令,如果有多个命令需要执行,可以用&&相连,这样可以防止每个命令用一个RUN导致镜像层数过多。Union FS有最大层数限制,比如 AUFS,曾经是最大不得超过42层,现在是不得超过127层。

COPY 复制文件

指令格式:

1
2
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]

COPY用于将构建上下文中的<源路径>的文/目录复制到镜像内的<目标路径>,源路径可以有多个,<目标路径>可以是容器内的绝对路径,也可以是相对于工作目录(用WORKDIR指令指定的)的相对路径。目标路径无需事先创建,如果目标路径不存在会自动创建。

需要注意的是,使用COPY指令复制文件,源文件的各种属性如读写执行权限、文件创建时间等都会保留,等于是原封不动地将文件复制过去。

ADD 复制文件并解压

指令格式:

1
2
ADD <源路径>... <目标路径>
ADD ["<源路径1>",... "<目标路径>"]

ADD指令和COPY指令类似,都可以将文件复制到镜像内,但如果源文件是一个压缩文件时,复制到镜像后会自动解压。在实践中,如果只是希望复制文件,就使用COPY指令,如果希望解复制并压缩一个压缩文件到镜像,就使用ADD

CMD 容器启动命令

1
2
CMD <命令>
CMD ["可执行文件", "参数1", "参数2"...]

CMD指令用于指定默认的容器主进程的启动命令。

ENRTYPOINT 容器启动入口点

指令格式:

1
2
ENRTYPOINT <命令>
ENRTYPOINT ["可执行文件", "参数1", "参数2"...]

当指定ENRTYPOINT后,CMD的内容将作为参数传递给ENRTYPOINT。执行时,变为:

<ENTRYPOINT> "<CMD>"

ENV 设置环境变量

指令格式:

1
2
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

ENV用来设置环境变量,在设置某个环境变量后,之后的指令可以引用这个环境变量。

ARG 构建参数

指令格式:

1
ARG <key>[=<value>]

ARGENV类似,都是指定环境变量,但ARG是指定构建时的环境变量,在容器运行时是不存在这些环境变量的。

VOLUME 指定匿名卷

指令格式:

1
2
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

我们要保持容器的无状态,因此不应该向容器的存储层写入任何需要持久化的数据。为此可以事先指定某些目录挂载为匿名卷,然后再启动容器时通过-v参数将宿主机的命名卷挂载到容器的匿名卷上。之后容器将数据写入这个匿名卷实际就是将数据写入宿主机的这个命名卷上。

EXPOSE 声明暴露端口

指令格式:

1
EXPOSE <端口1> [<端口2>...]

EXPOSE指令只是声明容器运行时暴露的端口,它并不会去真正暴露端口,这仅仅是一个声明。这可以帮助镜像使用者了解该镜像端口暴露的情况,在运行容器时可以使用-p参数指定宿主机到容器的端口映射。

WORKDIR 指定工作目录

指令格式:

1
WORKDIR <工作目录路径>

WORKDIR指令用来指定工作目录,指定后各层的工作目录就被更改为指定的目录。如果该目录还不存在,会自动建立该目录。

USER 指定当前用户

指令格式:

1
USER <用户名>

USER指令可以改变以后的层执行命令时使用的用户,当然这个用户必须是事先建立好的,否则无法进行用户指定。

HEALTHCHECK 健康检查

指令格式:

1
2
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK支持下列选项:

–interval=<间隔>:两次健康检查的间隔,默认为30秒;
–timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认30秒;
–retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认3次。

ONBUILD 以当前镜像为基础镜像构建下一级镜像时执行具体指令

指令格式:

1
ONBUILD <其它指令>

ONBUILD指令后面指定的指令将在以当前镜像为基础构建下一级镜像时才会去执行。