我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 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的安装
- Docker的配置文件 daemon.json 详细解
- Docker的启动参数
- Docker的命令之概述
- Docker的命令之容器管理 Container
- Docker的命令之镜像管理 Image
- Docker的命令之网络管理 network
- Docker的命令之集群节点管理 Swarm node
- Docker的命令之插件管理 Plugin
- Docker的命令之安全管理 Docker secret
- Docker的命令之集群服务管理 Service
- Docker的命令之 Docker stacks
- Docker的命令之集群管理 swarm
- Docker的命令之系统管理 Docker system
- Docker的命令之数据卷管理 Volume
- Docker的命令之快捷指令
- Docker中的镜像构建-Dockerfile指令详解
- Docker的实践笔记
- Docker create / Docker run 的选项详解
Pingback引用通告: Docker的命令之镜像管理 Image | 精彩每一天
Pingback引用通告: Docker create / Docker run 的选项详解 | 精彩每一天