Docker 以通过读取Dockerfile
里面的命令来自动构建镜像。Dockerfile
是一个包含了用户构建一个镜像的所有命令的文本文档。用户们可以使用 docker build 顺序执行一些列的命令行来自动构建镜像。
这篇博客主要是叙述在Dockerfile
使用到的命令。当你完成了这篇博客的阅读,可以参考 Dockerfile
最佳实践指南提示。
docker build
命令会根据Dockerfile
文件和上下文来构建镜像。构建时的上下文主要是指在指定的路径PATH或者URL里面的文件集合。PATH指的是在本地文件系统里的路径。URL是指Git 仓库的路径。
构建的时候上下文是会递归执行的。所以,PATH包含了一些子路径和URL包含了仓库已经它的子模块。下面的例子展示了在当前路径作为上下文运行构建命令:
$ docker build .
Sending build context to Docker daemon 6.51 MB
...
构建是通过Docker daemon运行的,而不是客户端。在构建之前,会
发送整个上下文(递归地)daemon。在大多数情况下,一开始最好在一个空的目录作为上下文和保留你的Dockerfile
在目录里。仅添加构建Dockerfile
需要的文件。
注意:不要使用你的根目录,/,作为PATH, 因为构建的时候会把你整个硬盘的内容传送到Docker daemon。
想在构建的上下文使用一个文件,可以使用Dockerfile的命令去指定一个文件,例如,COPY 命令。为了提高构建的性能,可以通过添加一个.dockerignore
文件去排除文件以及目录。至于怎么创建一个.dockerignore
文件,可以参考博客后面.dockerignore
创建。
一般来说,Dockerfile
直接使用上下文的根目录里的Dockerfile
。当然你可以在docker build
时添加-f
标志(参数)指定Dockerfile
在你文件系统里的任意位置。
$ docker build -f /path/to/a/Dockerfile .
当构建成功时,你可以指定一个镜像仓库和标签去保存新的镜像。
$ docker build -t shykes/myapp .
构建成功后,为了在多个镜像仓库给同一个镜像加标签,可以在使用build命令是添加多个 -t 参数:
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
在Docker daemon 运行Dockerfile
里面的命令之前,会执行Dockerfile初步的校验,当有语法不合法时,会返回错误提示。
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
Docker daemon
会一行一行地运行Dockerfile
里面的指令,在最后输出新的镜像前,会提交每个指令的必要的结果到新的镜像。Docker daemon
会自动清楚你发送的上下文。
需要知道的是,每一个指令是独立运行的,因此当一个镜像被创建了,运行 RUN cd/tmp 将不会影响下一个指令。
只要有可能,Docker 会重复利用镜像中间物(缓存),使之 docker build 的过程得到明显地加速,这个会在控制台输出 Using cache的信息来表明。(更多信息,请查看Dockerfile
最佳实践指南的Build cache section):
$ docker build -t svendowideit/ambassador .
Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
---> 31f630c65071
Step 2/4 : MAINTAINER SvenDowideit@home.org.au
---> Using cache
---> 2a1c91448f5f
Step 3/4 : RUN apk update && apk add socat && rm -r /var/cache/
---> Using cache
---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed 's/.`_PORT_\([0-9]`\)_TCP=tcp:\/\/\(.`\):\(.`\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
---> Using cache
---> 7ea8aef582cc
Successfully built 7ea8aef582cc
当镜像有本地父链时才可以使用构建缓存。这意味着,这些镜像在前面的构建就已经被创建了或者整个镜像链通过 docker load 加载了。如果你想使用指定镜像的构建缓存,你可以通过使用 --cache-from 的选项。使用 --cache-from来指定的镜像不需要拥有父链和可以从其它注册中心拉取。
当你完成了构建,你就已经准备好了去参看 推送一个仓库到注册中心