dockerfile语法

Posted _雪辉_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dockerfile语法相关的知识,希望对你有一定的参考价值。


  dockerfile 描述了组装镜像的步骤,其中每条指令都是单独执行的。除了FROM指令,其他每一条指令都会在上一条指令所生成镜像的基础上执行,执行完后会生成一个新的镜像层,新的镜像层覆盖在原来的镜像之上从而形成了新的镜像。dockerfile所生成的最终镜像就是在基础镜像上面叠加一层层的镜像层组件的。dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

一、FROM

FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]

FROM是一个镜像构建开始的第一条指令,而非必须是dockerfile文件的第一行非注释指令。FROM之前可以有其他指令,这个指令就是ARG,并且是唯一一个可声明在FROM之前的指令,声明在FROM之前的ARG指令,因为在构建之外,所以不能在FROM之后的任何地方使用,在FROM指令前声明的ARG指令需要指定默认值,在构建体中使用ARG指令可以不用指定默认值;

二、RUN

shell 格式:RUN <command> (/bin/sh -c /S /C)
exec 格式:RUN ["executable", "param1", "param2"]

RUN指令将会在前一条命令创建出的镜像的基础之上创建一个容器,并在容器中运行命令,在命令结束运行后提交容器为新镜像,新镜像将被dockerfile中的下一条指令使用。

三、CMD

exec格式(推荐):CMD ["executable","param1","param2"]
entrypoint格式:CMD ["param1","param2"] 
shell格式:CMD command param1 param2

docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。它的主要目的是为执行中的容器提供默认值。

四、LABEL

LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL指令以key=value方式给镜像添加元数据,要在LABEL值中包含空格,请使用引号和反斜杠,就像在命令行解析中一样;
基础镜像、父镜像中包含的标签会被继承,如果镜像中标签已经存在但具有不同的值,则后面设置的值会覆盖先前设置的值;
一个镜像中可以有多个标签。您可以在一行上指定多个标签。

五、EXPOSE

EXPOSE <port> [<port>/<protocol>...]

EXPOSE指令通知docker容器在运行时监听指定的网络端口,可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。

六、ENV

设置一个:ENV <key> <value>
设置多个:ENV <key>=<value> <key1>=<value1> ...

ENV指令将镜像运行时环境变量设置为。此值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。

七、ADD

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD指令是有上下文的(默认为当前dockerfile所在目录),从dockerfile文件相对的src路径下复制其下的文件/文件夹到docker镜像的工作目录下的相对的dest目录。

八、COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

COPY 指令复制所指向的文件或目录,将它添加到新镜像中,复制的文件或目录在镜像中的路径是。所指定的源可以有多个,但必须在上下文中,即必须是上下文根目录的相对路径。

九、ENTRYPOINT

exec格式:ENTRYPOINT ["executable", "param1", "param2"]
shell格式:ENTRYPOINT command param1 param2

ENTRYPOINT指令和 CMD 相似,都可以让容器在每次启动时执行相同的命令,但是又有不同的地方,CMD可以是命令,也可以是参数,而ENTRYPOINT只能是命令。

十、VOLUME

VOLUME ["/data"]

VOLUME指令创建具有指定名称的挂载点,并将其标记为从本机主机或其他容器保留外部挂载的卷。该值可以是JSON数组VOLUME ["/var/log/"]或具有多个参数的纯字符串。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

十一、USER

USER <user>[:<group>]
USER <UID>[:<GID>]

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。

十二、WORKDIR

WORKDIR /path/to/workdir

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,在WORKDIR指令之前执行的指令,由于没有设置WORKDIR,它默认为当前镜像构建的上下文根目录,所以会基于根目录执行。

十三、ARG

ARG <name>[=<default value>]

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。通过 docker history 可以看到所有设置的值。

十四、ONBUILD

ONBUILD [INSTRUCTION]

ONBUILD 是一个特殊的指令,它的功能时添加一个将来执行的触发器指令到镜像中,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行,当该镜像作为FROM指令的参数时, 这些触发器指令就会在FROM指令执行时加入到构建中。当需要构建一个基础镜像时,ONBUILD是很有用的。

以上是关于dockerfile语法的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile语法

9Dockerfile语法

Docker 之 Dockerfile 常用语法与实战

Docker之Dockerfile语法详解

Dockerfile语法规则

dockerfile 语法