Dockerfile 简介
什么是 Dockerfile
Dockerfile 其实就是根据特定的语法格式撰写出来的一个普通的文本文件
利用 docker build 命令依次执行在 Dockerfile 中定义的一系列命令, 最终生成一个新的镜像 (定制镜像)
Dockerfile 示例与使用
Dockerfile 使用命令 - docker build
作用:
根据 dockerfile 创建镜像
命令格式:
docker build [OPTIONS] PATH | URL | -
命令参数:
PATH Dockerfile 所在路径 (文件夹路径), 文件名必须是 Dockerfile
URL Dockerfile 所在 URL 地址
OPTIONS:
-t, --tag list 为镜像设置名称和 tag
-f, --file string 指定 Dockerfile 的路径 (这是可以使用其他名称命名 Dockerfile)
案例演示
- mkdir Dockerfile-dir
- cd Dockerfile-dir/
- vi Dockerfile
输入以下内容
- # 注释
- FROM CentOS
- RUN echo '这是一个测试的 docker file'
执行 docker file 目录
docker build /root/Dockerfile-dir
可以在上面看到新创建的镜像没有 名称和 TAG 信息 , 使用 -t 参数指定
docker build /root/Dockerfile-dir -t test:v1.0
docker build 默认指定 docker file 所在的目录, 它会自动的寻找其下面的 Dockerfile 文件, 那么我们在其目录下 dockerfile 不是以 Dockerfile 命名的话, 就会报错
可以使用 -f 参数解决这个问题
docker build . -f /root/Dockerfile-dir/test_docker_file -t test2:v1.0
对一个 docker 文件多次 build 可以发现以下规律
cat Dockerfile
docker build . -t test
可以发现多次 build 一个 docker file 使用过的命令不在执行
在 docker file 中新增一条命令
- vi Dockerfile
- # 注释
- FROM CentOS
- RUN echo '这是一个测试的 docker file'
- RUN echo '这是一个在后面添加'
再次 build
docker build . -t test
可以发现, 在后面新增的执行, 以前旧的使用的是缓存不执行
在 docker file 前面添加一条命令
- # 注释
- FROM CentOS
- RUN echo '这是一个在前面添加'
- RUN echo '这是一个测试的 docker file'
- RUN echo '这是一个在后面添加'
再次 build
docker build . -t test
可以发现所有命令都执行
由此可以得出这样的一个结论, 在一个步奏修改了内容, 前面的不变, 后面的都会被执行
通过查看镜像的历史记录可以知道, 执行一条命令都会在原有的基础上增加一层, 所以在写 docker file 的时候要尽量在后面添加东西, 这样就不会把前面的层重新构建
doker file 底层就是调用 docker commit 把容器变成一个镜像
Dockerfile 特征
查看官方的 Dockerfile:https://github.com/docker-library/docs
Dockerfile 构建特征 (二)
Dockerfile 必须具备一个 FROM 命令来进行构建
每一个 Dockerfile 命令都会构建一层镜像 (本质上是每一层都会启动一个容器, 执行完命令后, 将容器进行提交后, 产生新的镜像层)
通过查看下载下来的镜像, 发现历史层信息的层 ID 是 missing, 其实是因为原本的层 id 只存在于构建镜像的宿主机上, 一旦转移镜像后, 历史层消息中将只保留最新一层的 ID
Dockerfile 命令概述 (一)
查看完整介绍
https://docs.docker.com/engine/reference/builder/#usage
FROM: 指定基础镜像
RUN: 构建镜像过程中需要执行的命令. 可以有多条. docker build
CMD: 添加启动容器时需要执行的命令. 多条只有最后一条生效. 可以在启动容器时被覆盖和修改.
ENTRYPOINT: 同 CMD, 但这个一定会被执行, 不会被覆盖修改.
: 为镜像添加对应的数据.
MLABELAINTAINER: 表明镜像的作者. 将被遗弃, 被 LABEL 代替.
EXPOSE: 设置对外暴露的端口.
ENV: 设置执行命令时的环境变量, 并且在构建完成后, 仍然生效
ARG: 设置只在构建过程中使用的环境变量, 构建完成后, 将消失
ADD: 将本地文件或目录拷贝到镜像的文件系统中. 能解压特定格式文件, 能将 URL 作为要拷贝的文件
COPY: 将本地文件或目录拷贝到镜像的文件系统中.
VOLUME: 添加数据卷
USER: 指定以哪个用户的名义执行 RUN, CMD 和 ENTRYPOINT 等命令
WORKDIR: 设置工作目录
Dockerfile 命令概述 (二)
ONBUILD: 如果制作的镜像被另一个 Dockerfile 使用, 将在那里被执行 Docekrfile 命令
STOPSIGNAL: 设置容器退出时发出的关闭信号.
HEALTHCHECK: 设置容器状态检查.
SHELL: 更改执行 shell 命令的程序. Linux 的默认 shell 是 ["/bin/sh", "-c"],Windows 的是 ["cmd", "/S", "/C"].
备忘:
Docker 容器与镜像之间的关系 (尤其 commit 命令的作用和效果)
Dockerfile 的书写规则和使用规则
查看官方的 Dockerfile:https://github.com/docker-library/docs (看看官方的案例)
来源: http://www.bubuko.com/infodetail-3037346.html