build 的帮助文件中我们可以看到,docker build 不仅能支持本地 Dcokerfile 的构建,还可以从 URL 以及标准输入(-)中读取信息进行构建,下面就来说说 docker build 的几种构建方式。

使用 dockerfile 构建

最常见的也是最便捷的一种构建方式,可以指定 dockerfile 文件,也可以自动使用上下文路径中以 Dockerfile 命名的文件来构建。

使用方式:

上下文路径

什么是上下文路径呢?大家可以注意到构建命令后面有个 .。没错,它就是初学 docker 时误以为是 Dockerfile 存放路径的那个上下文路径。

其实这个上下文路径并不是 Dockerfile 的存放路径,虽然默认的 Dockerfile 确实是从此路径中获取,但是 Dockerfile 可以使用 -f 参数指定,所以上下文路径和 Dockerfile 的存放路径没有必然的联系。

在 Dockerfile 的编写中,无可避免地会使用 COPYADD 来将本地文件拷贝到镜像内,比如:

这个 -6.repo 所存在的本地路经,并不是绝对路径,也不是相对于 Dockerfile 的路经(使用自定义名称 Dockerfile 的时候),而是 build 命令最后的那个上下文路径(也就是那个 .)。

使用 repo 构建

docker build 可以使用 URL 进行构建,这个 URL 也可以是 git 仓库地址。

这个命令主要关注点有两个,一是使用默认分支(一般是 master);二是指定构建路径(#:stable/stretch)。

使用 tar 压缩包构建

docker build 也可以下载 tar 压缩包自动解压进行构建。

使用 tar 压缩包构建需要注意一点,就是无法指定构建目录,所以 Dockerfile 必须放置于解压后的根目录下,也就是说打包的时候不能对整个父目录进行打包,只能对 Dockerfile 所在的目录和文件进行打包(tar cvf stretch.tar *)。

从标准输入中读取 dockerfile 构建

docker build 可以从标准输入中读取构建内容来进行构建。

可以直接输入进行构建:

也可以使用读取文件的形式进行构建:

从标准输入中读取上下文压缩包构建

之前说使用 tar 压缩包构建的时候,使用的是远程的 tar 包进行构建,那本地 tar 包该怎么构建呢?其实还是使用标准输入的方式进行构建。

Have fun!