Dockerfile详细解析(一)——使用方法

Dockerfile参考指南

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来指定的镜像不需要拥有父链和可以从其它注册中心拉取。

当你完成了构建,你就已经准备好了去参看 推送一个仓库到注册中心

你可能感兴趣的:(Docker,devops)