Dockerfile简介
Docker可以通过Dockerfile中的指令,自动的构建镜像.
Dockerfile又是什么?
一个Dockerfile就是一个文本文档,在这文档内,包含了用户可以在命令行上调用的,用来编排容器的所有指令.
可以使用:
docker build 命令
它会连续的执行Dockerfile中的一些指令,来自动的为我们构建镜像.
1. build语法
docker build命令,可以通过Dockerfile及其上下文环境context
来构建一个镜像.
所谓的context
,所指的是,用来构建镜像的一系列文件所放置的PATH
或者是URL
.
PATH:指的是本地文件系统中的目录.
URL:指的是Git仓库的地址.
context中的结构会被递归访问,也就是说
PATH及其所包含的所有子目录.
# and
URL所指向的仓库及其子模块.
假设当前目录为context的话,那么编译命令为:
sudo docker build .
build命令是动过Docker 后台进程(daemon)来执行的,并非shell的命令行.
build首先要做的就是讲整个context
内容发送到daemon.
在大多情况下,最好创建一个空的目录来进行操作,将你的Dockerfile放到该目录,再将需要的内容添加进来.
不要用根目录,/作为PATH,因为这会导致,build会将整个硬盘的内容都加载到Docker daemon
如果想要在build的context中使用某个文件,需要使用诸如COPY
等指令将文件添加上下文.
为了提高build时的性能,很多不需要被打包进镜像的目录或文件可以写入.dockerignore
文件中,.dockerignore文件本身也不会被打包进镜像.
Dockerfile
一般都命名为Dockerfile,并且被放在context的根,但是也可以通过使用-f
选项,来指定放在任意目录的Dockerfile
。
sudo docker build -f /path/to/a/Dockerfile .
你也可以指定一个仓库和标签,来存放build成功后生成的镜像.(也可以使用多个-t选项,来指定多个仓库存放生成的镜像)
docker build -t REPOSITORY/TAG.
Docker daemon在执行Dockerfile中的指令之前,会先对语法进行初步校验,如果有语法错误它会将错误信息反馈给我们.
Docker daemon会逐行执行Dockerfile中的指令,在最终生成新的镜像ID之前,如果有必要它会将每一条指令的执行结果都提交成一层新的镜像.最后Docker daemon会自动清理添加到context中的内容.
值得注意的是,每条指令都是独立运行并且会产生一层新的镜像,因此,RUN cd /tmp
对它下一条指令不会有任何影响,即不会切换到/tmp目录中.
1.1BuildKit
自18.09版本开始,Docker支持moby/buildkit
项目所提供的一种新的后台来执行镜像的构建——BuildKit
与老版本相比它有很多优势:
1. Detect and skip executing unused build stages
检测并且跳过无用的步骤
2. Parallelize building independent build stages
可以并行执行彼此独立的步骤
3. Incrementally transf