Docker中的镜像构建-Dockerfile指令详解

我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

可以参考:https://github.com/yeasy/docker_practice/blob/master/image/build.md

 一、FROM:指定基础镜像

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

二、RUN :执行命令

UN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。
其格式有两种:

1、shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。
例如:RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

2、exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。

 三、COPY:复制文件

  • COPY <源路径>… <目标路径>
  • COPY [“<源路径1>”,… “<目标路径>”]

Tips 1:注意这里<源路径>,是一个相对地址,是指相对于build中指定的上下文路径。<目标路径>为容器中的根目录/下的绝对路径。

四、ADD:更高级的复制文件

ADD指令和COPY指令功能和使用方式类似。只是COPY指令不会做自动解压工作。

Tips 2:可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。

五、CMD:容器启动命令

  • shell 格式:CMD <命令>
  • exec 格式:CMD [“可执行文件”, “参数1″, “参数2″…]
  • 参数列表格式:CMD [“参数1″, “参数2″…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

六、ENTRYPOINT:入口点

参考:https://github.com/yeasy/docker_practice/blob/master/image/dockerfile/entrypoint.md

七、ENV:设置环境变量

  • ENV <key> <value>
  • ENV <key1>=<value1> <key2>=<value2>…

 八、ARG:构建参数

  • 格式:ARG <参数名>[=<默认值>]

九、VOLUME:定义匿名卷

  • VOLUME [“<路径1>”, “<路径2>”…]
  • VOLUME <路径>

十、EXPOSE: 声明端口

  • 格式为 EXPOSE <端口1> [<端口2>…]

十一、WORKDIR: 指定工作目录

  • 格式为 WORKDIR <工作目录路径>

十二、USER:指定当前用户

  • 格式:USER <用户名>

USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。

当然,和 WORKDIR 一样,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。

十三、HEALTHCHECK :健康检查

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

HEALTHCHECK 支持下列选项:

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

十四、ONBUILD :为他人做嫁衣裳

  • 格式:ONBUILD <其它指令>。

ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

 

推荐相关文档:

Docker中的镜像构建-Dockerfile指令详解》上有2条评论

  1. Pingback引用通告: Docker的命令之镜像管理 Image | 精彩每一天

  2. Pingback引用通告: Docker create / Docker run 的选项详解 | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>