Dockerfile创建完成后,可以使用docker build命令根据Dockerfile构建一个镜像。在上一节中,我们在Dockerfile所在的文件夹下执行docker build -t myimage .这条命令,然后镜像就被构建了。现在我们来详细地讲这条命令。该docker build的命令格式如下:
引用
# docker build[OPTIONS]上下文路径|URL
其中,
" docker build: 用Dockerfile构建镜像的命令关键词
" [OPTIONS]: 命令选项,常用的指令包括-t指定镜像的名字,-f显示指定Dockerfile,如果不使用-f,则默认将上下文路径下的名为Dockerfile的文件认为是构建镜像的"Dockerfile"。具体命令使用docker build -help能够查看到。
" 上下文路径|URL: 指定构建镜像的上下文的路径,构建镜像的过程中,可以且只可以引用上下文中的任何文件。
"
现在让我们在看看docker build -t myimage .这条命令,在这条命令中,使用-t指定了镜像名为myimage,由于没有使用-f指令,所以默认使用上下文路径下名为Dockerfile的文件认为是构建镜像的"Dockerfile"。最后指定上下文路径,在这条命令中,上下文路径是.
执行docker build后,会首先将上下文目录的所有文件都打包,然后传给Docker daemon,这样 Docker daemon收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
如下图所示,在执行完docker build后,会首先sending build context to Deckor daemon,也就是将上下文目录下所有文件打包发给Docker daemon。所以在使用Dockerfile文件时构建镜像时,一般将它放在一个空文件夹下,就是为了防止将其他多余的文件传出去。然后依次执行Dockerfile的指令,如果指令正确执行,则继续执行下一条,直到所有指令执行正确完毕,镜像构建完成;如果指令执行出错,终止镜像构建。
引用
1. [root@localhost newdir]# docker build-t myimage .
2. Sending build context toDocker daemon 2.048 kB
3. Step1/2: FROM ubuntu
4. --->14f60031763d
5. Step2/2: RUN mkdir dir1
6. --->Runningin c5117d908931
7. ---> cb0193727724
8. Removing intermediate container c5117d908931
9. Successfully built cb0193727724
2. Sending build context toDocker daemon 2.048 kB
3. Step1/2: FROM ubuntu
4. --->14f60031763d
5. Step2/2: RUN mkdir dir1
6. --->Runningin c5117d908931
7. ---> cb0193727724
8. Removing intermediate container c5117d908931
9. Successfully built cb0193727724
除了从本地构建以外,docker build还支持从URL构建。
$ docker build github.com/creack/docker-firefox
该条build命令会克隆GitHub仓库的项目并且会使用克隆的仓库作为docker 的仓库上下文,而build命令会在上下文的根目录寻找Dockerfile。你可以使用git://或者git@scheme指定任意的Git仓库。
注,如果是build URL就不需要指定上下文路径,二选一。
docker build -f ctx/Dockerfile http://server/ctx.tar.gz
上面的build语句表示,从URL:http://server/ctx.tar.gz下载docker的仓库上下文。并且指定压缩包内路径下ctx/Dockerfile为该次building的Dockerfile,下面是输出:
引用
$ docker build -f ctx/Dockerfile http://server/ctx.tar.gz
Downloading context: http://server/ctx.tar.gz [===================>] 240 B/240 B
Step 1/3 : FROM busybox
---> 8c2e06607696
Step 2/3 : ADD ctx/container.cfg /
---> e7829950cee3
Removing intermediate container b35224abf821
Step 3/3 : CMD /bin/ls
---> Running in fbc63d321d73
---> 3286931702ad
Removing intermediate container fbc63d321d73
Successfully built 377c409b35e4
Downloading context: http://server/ctx.tar.gz [===================>] 240 B/240 B
Step 1/3 : FROM busybox
---> 8c2e06607696
Step 2/3 : ADD ctx/container.cfg /
---> e7829950cee3
Removing intermediate container b35224abf821
Step 3/3 : CMD /bin/ls
---> Running in fbc63d321d73
---> 3286931702ad
Removing intermediate container fbc63d321d73
Successfully built 377c409b35e4
除了以上两种build (本地和通过URL),docker其实还可以通过STDIN来进行build,具体看下米娜这段build命令:
$ docker build - < Dockerfile
这段命令表示docker使用标准输入(STDIN)来build一个镜像,但是这种build就没有仓库上下文路径,所以因为缺少上下文,就没有任何本地目录相关的内容发送至docker的守护进程。因为没有内容,被build的dockerfile使用的ADD指令只能add远程URL。
$ docker build - < context.tar.gz
上面的build命令也是使用标准输入(STDIN)来build一个镜像,不过标准输入来源一个压缩包,docker build支持一下格式的压缩包:bizp2,gzip和xz。
接下来学习一下docker build的一些常用命令:
1. -t命令
$ docker build -t vieux/apache:2.0 .
这段build命令加入了-t这个命令,表示指定了镜像名为vieux/apache,而指定版本tag为2.0,
在一次build过程中你可以提供多个tag给一个image,比说下面这段build,表示build了一个whenry/fedora-jboss的镜像,但是同时tage了2.1版本和latest版本
$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
2. -f命令
$ docker build -f Dockerfile.debug .
指定Dockerfile就要使用-f命令,上面指定了一个在当前目录下具体的Dockerfile.debug为将要使用的dockerfile。
$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug . $ docker build -f dockerfiles/Dockerfile.prod -t myapp_prod .
上面的命令第一条在当目录dockerfiles下寻找Dockerfile.debug文件作为Dockerfile文件,并且在当前目录下进行build一个叫myapp_debug的镜像。
上面的命令第二条在当目录dockerfiles下寻找Dockerfile.prod文件作为Dockerfile文件,并且在当前目录下进行build一个叫做myapp_prod的镜像。
3. --add-host命令
$ docker build --add-host=docker:10.180.0.1 .
上面这段build表示在build之后将docker:10.180.0.1写入build 好的镜像的/etc/hosts文件里。你可以加多个-add-host。
1. --target命令
引用
FROM debian AS build-env
...
FROM alpine AS production-env
...
...
FROM alpine AS production-env
...
如上我们看到,当一个Dockerfile里面需要build多个stage的内容,如果指定了-target标签如下,则build只会build这个build-env的内容。
$ docker build -t mybuildimage --target build-env .