Dockerfile 说明
FROM
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
FROM 指令 初始化一个新的构建阶段,为随后的指令设置了基础镜像。因此一个有效的Dockerfile 文件必须是以 FROM 指令开始的。该 镜像可以是任何有效的镜像,从公共存储库中提取图像特别容易开始。
RUN
RUN <command>
RUN ["executable","param1","param2"]
RUN 指令将执行多个命令在当前镜像的顶部的新的一层,同时提交执行的结果。这个结果将被用做Dockerfile 的下一步
CMD
CMD ["executable","param1","param2"] (exec形式,这是首选形式)
CMD ["param1","param2"] (作为 ENTRYPOINT 的默认值)
CMD command param1 param2 (shell 脚本形式)
一个 Dockerfile 文件中只能有一个 CMD 指令,如果你使用了多个 CMD 指令,那么只有最后一个 CMD 指令会生效。
一个 CMD 指令的主要目是为执行中的 container 容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定一条ENTRYPOINT 指令
注意
-
如果CMD用于提供ENTRYPOINT 指令的默认参数,则CMD和ENTRYPOINT指令均应使用JSON数组格式指定
-
exec形式被解析为JSON数组,这意味着您必须在单词周围使用双引号(“)而非单引号(')
-
与 shell 形式不同,exec 不会调用 命令 shell,这意味着普通的 shell 进程不会发生,如:
CMD["echo", "HOME,如果你也想使用 exec 方式执行 shell ,可以这样:CMD["sh","-c" ,"echo $HOME"] -
如果用户指定了参数,docker run 则它们将覆盖中指定的默认参数CMD。
-
请勿RUN与混淆CMD。RUN实际上在启动阶段运行命令并提交结果;CMD在启动过程中不执行任何操作,但在启动之后执行
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
该LABEL指令将元数据添加到镜像。 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>/<protocol>...]
EXPOSE指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。
该EXPOSE指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种** 文档类型 ,有关打算发布哪些端口的信息。要在运行容器时实际发布端口,请使用 -p标记 docker run 来发布和映射一个或多个端口,或者使用-P标记来发布所有公开的端口并将它们映射到高阶端口 **。
默认, EXPOSE 指令使用 TCP 协议. 你也可以指定 UDP:
EXPOSE 80/udp
同时指定 TCP 和 UDP, 包括两行:
EXPOSE 80/tcp
EXPOSE 80/udp
无论 EXPOSE 如何设置,你都需要在运行时使用 -p 来重写
docker run -p 80:80/tcp -p 80:80/udp ...
ENV
ENV <key> <value>
ENV <key>=<value> ...
ENV 指令将环境变量 <key> 设置为 <value> 。此值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可替换
ENV 有两种形式。第一种形式 ENV <key> <value> 会将一个变量设置为一个值。第一个空格之后的整个字符串将被视为 <value> ,包含空格字符。第二种形式 ENV <key>=<value> .. 允许一次设置多个变量。
例如:
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
和
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
将在最终镜像中产生相同的结果
ADD
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (此格式对于包含空格的路径是必需的)
ADD 命令用于从 <src> 中复制 新文件、目录或远程文件的 URLs ,并将它们添加到该路径的镜像文件系统中<dest>。
<src>可以指定多个资源,但是如果它们是文件或目录,则将其路径解释为相对于构建上下文源的路径。每个都<src>可能包含通配符
如:
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt"
<dest>是一个绝对路径,或相对于一个路径WORKDIR,到其中的源将在目标容器内进行复制。
ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # adds "test" to /absoluteDir/
** 注意 **:
- 目录本身不被复制,仅被复制其内容
- 如果<src>是任何其他类型的文件,则将其及其元数据一起单独复制。在这种情况下,如果<dest>以斜杠结尾/,则将其视为目录,并将其内容<src>写入<dest>/base(<src>)
- 如果<src>直接或由于使用通配符而指定了多个资源,则该资源<dest>必须是目录,并且必须以斜杠结尾 /
- 如果<dest>不以斜杠结尾,则将其视为常规文件,并将其内容<src>写入<dest>
COPY
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] (此格式对于包含空格的路径是必需的)
COPY指令复制新文件或目录<src> ,并将它们添加到路径中容器的文件系统中<dest>。<src>可以指定多个资源,但是文件和目录的路径将被解释为相对于构建上下文的源,每个都<src>可能包含通配符
ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"] (exec 形式,首选)
ENTRYPOINT command param1 param2 (shell 形式)
ENTRYPOINT 允许您配置一个可执行的运行中的容器。
docker run -i -t --rm -p 80:80 nginx
docker run <image> 命令将会追加在 exec 形式的 ENTRYPOINT 命令前,同时将覆盖 CMD 中的参数,这里运行通过 -d 来传递参数给 ENTRYPOINT ,也可通过 docker run --entrypoint xx 来覆盖 ENTRYPOINT
shell 形式阻止所有 CMD 命令 或 docker run命令行参数
Dockerfile中,只有最后一条ENTRYPOINT指令才会生效。
VOLUME
VOLUME ["/data"]
该VOLUME指令创建具有指定名称的 mount point(挂载点),并将其标记为保存来自本地主机或其他容器的外部 mounted volumes。该值可以是JSON数组,也可以是VOLUME ["/var/log/"]具有多个参数的纯字符串,例如VOLUME /var/log或VOLUME /var/log /var/db
该docker run命令使用基础映像内指定位置上存在的任何数据初始化新创建的卷
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
该Dockerfile生成一个镜像,该镜像导致docker run 创建一个新的挂载点/myvol并将该文件复制 到新创建的 VOLUME 中。
WORKDIR
WORKDIR /path/to/workdir
该WORKDIR指令设置工作目录为 RUN,CMD, ENTRYPOINT,COPY和ADD 这些在Dockerfile 中的指令。如果WORKDIR不存在,那么即使以后的任何Dockerfile指令中都没有使用它,也将创建它。
该WORKDIR指令可以在中多次使用Dockerfile。如果提供了相对路径,则它将相对于上一条WORKDIR指令的路径 。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
执行 RUN 指令后的结果为 /a/b/c
该WORKDIR指令可以解析先前使用设置的环境变量 ENV。您只能使用在中显式设置的环境变量Dockerfile。例如:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd