用法

docker build命令从一个Dockerfile和上下文中构建镜像。构建的上下文是根据PATH或者URL指定的文件的位置。

PATH是你本地文件系统的一个文件夹。URL是一个Git仓库的位置。

上下文会被递归的进行处理。因此,一个PATH包括了它的任何子目录,URL包括了它的仓库和子模块。一个使用当前目录作为上下文进行build的例子:

$ docker build .
Sending build context to Docker daemon  6.51 MB
...

build被Docker daemon运行,而不是被CLI。build工作的第一步就是递归的发送上下文给daemon。在大多数情况下,以一个空的目录作为上下文并且保存你的Dockerfile是最好的。仅仅添加那些在build Dockerfile时用到的文件。

Warning:不要使用你的根目录,/,作为PATH。因为他会造成传输你整个硬盘的内容给Docker daemon。

为了使用build上下文中的文件,Dockerfile通过一些指令来指定他们,例如,COPY。为了提高build的性能,通过.dockerignore文件来把一些文件和目录从上下文中排除出去。如果你想了解如何编写一个.dockerignore文件,请看这个文档。

一般情况下,Dockerfile被称作Dockerfile,存放在上下文的根部。你同样在docker build命令中使用-f标记去指定一个Dockerfile在你的文件系统当中。

$ docker build -f /path/to/a/Dockerfile .

你可以指定一个构建成功以后的repository和tag去保存新镜像:

$ docker build -t shykes/myapp .

如果想要在构建后添加到多个repositories和tag,在你使用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中的指令,如果有必要的话会commit每条指令运行后的结果生成一个新的镜像。在最终输出新镜像的ID之前,Docker daemon会自动清理你发送的上下文。

请注意,每条指令运行都是独立的,并且会产生一个新的镜像。因此RUN cd /tmp这种用法不会对下条指令产生任何影响。

如果可能的话,Docker会重复的利用中间镜像(缓存)来加速docker build。这部分被Using cache消息在控制台中显示。(如果想获得更多的信息,请看Dockerfile的最佳实践构建缓存部分)。

$ 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

只会用镜像的本地上层存储来构建缓存。这意味着这些镜像会被原先的build所创建或者整个镜像的上层都是通过docker load所加载。如果你想使用一个特殊的镜像构建缓存使用--cache-from标记。被--cache-from标记的镜像不会需要上层镜像,并且可能会被其他registries所pull。

当你完成了你的构建,你需要看一下发布一个repository到他的registry

results matching ""

    No results matching ""