有用户容易将 Dockerfile 文件内的指令理解为 shell 脚本,其实并不是,Dockerfile 仅支持少部分的指令,下面介绍这些指令和功能。
FROM
- [backcolor=transparent]FROM [backcolor=transparent]<image>
或者
- [backcolor=transparent]FROM [backcolor=transparent]<image>[backcolor=transparent]:<[backcolor=transparent]tag[backcolor=transparent]>
或者
- [backcolor=transparent]FROM [backcolor=transparent]<image>[backcolor=transparent]@<[backcolor=transparent]digest[backcolor=transparent]>
指定构建依赖的基础镜像,FROM 指令必须作为 Dockerfile 中第一条没有被注释的指令。
MAINTAINER
- [backcolor=transparent]MAINTAINER [backcolor=transparent]<name>
指定镜像的 Author 字段。
RUN
shell 形式,command 作为 /bin/sh -c 的参数进行执行,即为 shell 的子进程。
- [backcolor=transparent]RUN [backcolor=transparent]<command>
exec 形式,直接执行。
- [backcolor=transparent]RUN [backcolor=transparent][[backcolor=transparent]"executable"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"param1"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"param2"[backcolor=transparent]]
RUN 指令是在当前镜像上执行命令,并且提交执行之后的结果,作为最新的一层 layer,并且后续的 Dockerfile 指令会在 RUN 指令执行完生成的最新镜像上继续执行。
CMD
exec 形式,直接执行,推荐使用该形式。
- [backcolor=transparent]CMD [backcolor=transparent][[backcolor=transparent]"executable"[backcolor=transparent],[backcolor=transparent]"param1"[backcolor=transparent],[backcolor=transparent]"param2"[backcolor=transparent]]
第二种形式,作为ENTRYPOINT指令的默认参数。
- [backcolor=transparent]CMD [backcolor=transparent][[backcolor=transparent]"param1"[backcolor=transparent],[backcolor=transparent]"param2"[backcolor=transparent]]
第三种形式,shell形式,作为/bin/sh -c的参数进行执行,即为 shell 的子进程。
- [backcolor=transparent]CMD command param1 param2
在一个 Dockerfile 文件中,只能有一个CMD指令,如果有多于一条CMD指令,那只有最后一条CMD指令会生效。
CMD指令的主要目的是提供容器运行时的默认值,这些默认值可以包括一个可执行文件名,加上执行时的一些参数,或者不包含可执行文件名,只提供参数,但是必须通过增加一个ENTRYPOINT指令来指定可执行文件名。
LABEL
- [backcolor=transparent]LABEL [backcolor=transparent]<key>[backcolor=transparent]=<[backcolor=transparent]value[backcolor=transparent]>[backcolor=transparent] [backcolor=transparent]<key>[backcolor=transparent]=<[backcolor=transparent]value[backcolor=transparent]>[backcolor=transparent] [backcolor=transparent]<key>[backcolor=transparent]=<[backcolor=transparent]value[backcolor=transparent]>[backcolor=transparent] [backcolor=transparent]...
LABEL指令给一个镜像增加元信息metadata。一个LABEL是一个键值对。如果LABEL值中需要包含空格或者换行符,使用双引号"或者反斜杠\。
下面是一些用例:
- [backcolor=transparent]LABEL [backcolor=transparent]"com.example.vendor"[backcolor=transparent]=[backcolor=transparent]"ACME Incorporated"
- [backcolor=transparent]LABEL com[backcolor=transparent].[backcolor=transparent]example[backcolor=transparent].[backcolor=transparent]label[backcolor=transparent]-[backcolor=transparent]with[backcolor=transparent]-[backcolor=transparent]value[backcolor=transparent]=[backcolor=transparent]"foo"
- [backcolor=transparent]LABEL version[backcolor=transparent]=[backcolor=transparent]"1.0"
- [backcolor=transparent]LABEL description[backcolor=transparent]=[backcolor=transparent]"This text illustrates \
- [backcolor=transparent]that label-values can span multiple lines."
EXPOSE
- [backcolor=transparent]EXPOSE [backcolor=transparent]<port>[backcolor=transparent] [backcolor=transparent][<[backcolor=transparent]port[backcolor=transparent]>...]
EXPOSE指令设置 Docker 容器在运行时监听指定网络端口。EXPOSE指令并不会使得容器所在的主机可以访问容器的端口。为了使主机可以访问容器端口,必须使用
-p 或者
-P 参数。
ENV
- [backcolor=transparent]ENV [backcolor=transparent]<key>[backcolor=transparent] [backcolor=transparent]<value>
- [backcolor=transparent]ENV [backcolor=transparent]<key>[backcolor=transparent]=<[backcolor=transparent]value[backcolor=transparent]>[backcolor=transparent] [backcolor=transparent]...
ENV指令设置镜像的环境变量,可在实际启动容器时使用docker run --env <key>=<value>进行覆盖。
ADD
有两种形式:
- [backcolor=transparent]ADD [backcolor=transparent]<src>[backcolor=transparent]...[backcolor=transparent] [backcolor=transparent]<dest>
第二种形式用于路径或者文件名包含空格的情况。
- [backcolor=transparent]ADD [backcolor=transparent][[backcolor=transparent]"<src>"[backcolor=transparent],...[backcolor=transparent] [backcolor=transparent]"<dest>"[backcolor=transparent]]
如果src是文件路径,则必须是相对于构建上下文context的相对路径,且不能引用构建上下文目录之外的内容。dest必须是绝对路径,或者是工作路径WORKDIR的相对路径。如果dest不存在,则将自动创建,如果dest不以/结尾,则将被认为是一个文件,而不是目录。
COPY
有两种形式:
- [backcolor=transparent]COPY [backcolor=transparent]<src>[backcolor=transparent]...[backcolor=transparent] [backcolor=transparent]<dest>
第二种形式用于路径或者文件名包含空格的情况。
- [backcolor=transparent]COPY [backcolor=transparent][[backcolor=transparent]"<src>"[backcolor=transparent],...[backcolor=transparent] [backcolor=transparent]"<dest>"[backcolor=transparent]]
与ADD类似,区别在于src不能是网络链接 URL。
ENTRYPOINT
exec 形式,推荐使用该形式。
- [backcolor=transparent]ENTRYPOINT [backcolor=transparent][[backcolor=transparent]"executable"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"param1"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"param2"[backcolor=transparent]]
shell 形式,command作为/bin/sh -c的参数进行执行,即为 shell 的子进程。
- [backcolor=transparent]ENTRYPOINT command param1 param2
ENTRYPOINT指令允许您指定容器启动时的启动进程。
VOLUME
- [backcolor=transparent]VOLUME [backcolor=transparent][[backcolor=transparent]"/data"[backcolor=transparent]]
VOLUME指令指定了一个挂载点,并给该挂载点命名,表明该挂载点的数据卷来自于主机的某个目录或者共享了其他容器的目录,该挂载点的内容不会随镜像的分发而分发。
USER
- [backcolor=transparent]USER daemon
USER指令设置启动镜像时的用户或者UID,随后所有在Dockerfile文件内的RUN,CMD以及ENTRYPOINT指令都将该用户作为执行用户。
WORKDIR
- [backcolor=transparent]WORKDIR [backcolor=transparent]/[backcolor=transparent]path[backcolor=transparent]/[backcolor=transparent]to[backcolor=transparent]/[backcolor=transparent]workdir
WORKDIR 指令设置工作目录,随后所有在Dockerfile文件内的RUN,CMD以及ENTRYPOINT指令都将该目录作为当前目录,并执行相应的命令。