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