Dockerfile是Docker用来构建镜像的文本文件,包括自定义的指令和格式 。可以通过docker build命令从Dockerfile中构建镜像 。用户可以通过统一的语法命令来根据需求进行配置,通过这份统一的配置文件,在不同的文件上进行分发,需要使用时就可以根据配置文件进行自动化构建,这解决了开发人员构建镜像的复杂过程 。
Dockerfile的使用Dockerfile描述了组装对象的步骤,其中每条指令都是单独运行的 。除了FROM指令,其他每条命令都会在上一条指令所生成镜像的基础上执行,执行完后会生成一个新的镜像层,新的镜像层覆盖在原来的镜像之上从而形成了新的镜像 。Dockerfile所生成的最终镜像就是在基础镜像上面叠加一层层的镜像层组建的 。
Dockerfile指令Dockerfile的基本格式如下:
# CommentINSTRUCTION arguments复制代码
在Dockerfile中,指令(INSTRUCTION)不区分大小写,但是为了与参数区分,推荐大写 。Docker会顺序执行Dockerfile中的指令,第一条指令必须是FROM指令,它用于指定构建镜像的基础镜像 。在Dockerfile中以#开头的行是注释,而在其他位置出现的#会被当成参数 。
Dockerfile中的指令有FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOING、VOLUME、USER、WORKDIR、ONBUILD,错误的指令会被忽略 。下面将详细讲解一些重要的Docker指令 。
FROM格式: FROM <image> 或者 FROM <image>:<tag>
FROM指令的功能是为后面的指令提供基础镜像,因此Dockerfile必须以FROM指令作为第一条非注释指令 。从公共镜像库中拉取镜像很容易,基础镜像可以选择任何有效的镜像 。在一个Dockerfile中FROM指令可以出现多次,这样会构建多个镜像 。tag的默认值是latest,如果参数image或者tag指定的镜像不存在,则返回错误 。
ENV格式: ENV <key> <value> 或者 ENV <key>=<value> ...
ENV指令可以为镜像创建出来的容器声明环境变量 。并且在Dockerfile中,ENV指令声明的环境变量会被后面的特定指令(即ENV、ADD、COPY、WORKDIR、EXPOSE、VOLUME、USER)解释使用 。
【一文玩转dockerfile】其他指令使用环境变量时,使用格式为$variable_name或者${variable_name} 。如果在变量面前添加斜杠可以转义 。如$foo或者${foo}将会被转换为$foo和${foo},而不是环境变量所保存的值 。另外,ONBUILD指令不支持环境替换 。
COPY格式: COPY <src> <dest>
COPY指令复制所指向的文件或目录,将它添加到新镜像中,复制的文件或目录在镜像中的路径是<dest> 。<src>所指定的源可以有多个,但必须是上下文根目录中的相对路径 。不能只用形如 COPY ../something /something这样的指令 。此外,<src>可以使用通配符指向所有匹配通配符的文件或目录,例如,COPY home* /mydir/ 表示添加所有以"hom"开头的文件到目录/mydir/中 。
<dest>可以是文件或目录,但必须是目标镜像中的绝对路径或者相对于WORKDIR的相对路径(WORKDIR即Dockerfile中WORKDIR指令指定的路径,用来为其他指令设置工作目录) 。若<dest>以反斜杠/结尾则其指向的是目录;否则指向文件 。<src>同理 。若<dest>是一个文件,则<src>的内容会被写到<dest>中;否则<src>指向的文件或目录中的内容会被复制添加到<dest>目录中 。当<src>指定多个源时,<dest>必须是目录 。如果<dest>不存在,则路径中不存在的目录会被创建 。
ADD格式:ADD <src> <dest>
ADD与COPY指令在功能上很相似,都支持复制本地文件到镜像的功能,但ADD指令还支持其他功能 。<src>可以是指向网络文件的URL,此时若<dest>指向一个目录,则URL必须是完全路径,这样可以获得网络文件的文件名filename,该文件会被复制添加到<dest>/<filename> 。比如 ADD http://example.com/config.property / 会创建文件/config.property 。
<src>还可以指向一个本地压缩归档文件,该文件会在复制到容器时会被解压提取,如ADD sxample.tar.xz / 。但是若URL中的文件为归档文件则不会被解压提取 。
ADD 和 COPY指令虽然功能相似,但一般推荐使用COPY,因为COPY只支持本地文件,相比ADD而言,它更加透明 。
EXPOSE格式: EXPOSE <port> [<port>/<protocol>...]
EXPOSE指令通知Docker该容器在运行时侦听指定的网络端口 。可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP 。这个指令仅仅是声明容器打算使用什么端口而已,并不会自动在宿主机进行端口映射,可以在运行的时候通过docker -p指定 。
推荐阅读
- 个人交社保、单位交社保,差别到底在哪里?一文读懂
- 看完这篇,再也不用焦虑如何写dockerfile了
- 一文搞懂交换基础知识
- 一文读懂常用开源许可证
- 抽水马桶是如何工作的?一文看懂虹吸原理
- 一文讲弄懂什么是vlan、三层交换机、网关、子网掩码
- 如何玩转 HTTP 3?
- 一文教您如何实现持续集成服务器环境搭建
- 一文搞定MySQL性能调优
- 一文了解神经网络工作原理