Dockerfile构建镜像
Dockerfile构建镜像的流程
- 首先,docker为CS架构(客户端-服务端),在虚拟机使用docker build, docker引擎会将Dockerfile的上下文目录(即Dockerfile所在的目录)的所有数据打包发送给docker服务端。
- 接着,服务端开始运行dockerfile的内容,每执行dockerfile的一行代码,就会生成一个中间镜像层,当执行下一行代码时,就会生成一个在上一层基础上进行修改的中间镜像层,每一层都是在上一层的基础上进行修改而生成的,这也是为什么构建过程有"层叠"的概念。
- 最后,当执行到最后一行,最后一次创建的中间镜像层就会成为最终镜像。它代表了 Dockerfile 中所有指令的执行结果和镜像的最终状态。
- 注意:这些产生的中间镜像层(包括最终镜像)会被缓存到Docker本地镜像仓库里,如果不想要这些缓存,比如说想构建一个同名但是全新(可以理解dockerfile的代码发生变化)的镜像,就要在dockerbuild后加一个参数-no-cache,加了会忽略本地镜像缓存。
Dockerfile命令
FROM
- Dockerfile的第一条指令必须为From,如果创建多个镜像在同一个dockerfile,就可以用多个FROM,一个FROM代表一个镜像。
- 语法格式:
css
复制代码
FROM 镜像名称 # 或者 FROM 镜像名称:版本号
MAINTAINER
- 用于指定维护者信息,也可以叫作者信息
- 语法格式:
less
复制代码
MAINTAINER 维护者信息(eg:yourName yourQQ@qq.com)
RUN
- RUN 指令将在当前镜像基础上执行指定命令,并提交为新的中间镜像层,当命令较长时可以使用 \ 来换行
- 语法格式:
bash
复制代码
RUN 执行的命令 #举例 RUN echo 'Asia/Shanghai' >/etc/timezone
VOLUME
- 基于镜像创建的容器添加数据卷,通过挂载将外部的目录或者其他容器的数据卷映射到该路径上,从而实现对数据的持久化
- 语法格式:
bash
复制代码
VOLUME 外部路径:容器路径 #举例 VOLUME /tmp
- 举例中只写了一个路径的话就代表容器路径,会创建一个匿名卷挂载到容器的tmp目录,这样,容器中对 /tmp 目录的读写操作将直接映射到匿名卷上。
- 默认情况下,Docker 会将匿名卷存储在位于宿主机的 /var/lib/docker/volumes/ 目录下。每个匿名卷都会以一个随机生成的唯一名称来标识,并在该目录下创建对应的子目录。
ADD
- 将dockerfile所在目录中指定的文件复制到镜像的指定目录中
- 同时可以识别远程URL,会自动下载URL对应的压缩包(不推荐使用)
- 如果指定的文件是压缩包(如 .tar, .gz, .zip 等),会自动解压缩文件复制到镜像