首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

docker build

描述

从Dockerfile生成图像

使用

代码语言:javascript
复制
docker build [OPTIONS] PATH | URL | -

备选方案

名字,简写

默认

描述

--add-host

?

添加自定义的主机到IP映射(主机:IP)

--build-arg

?

设置构建时间变量

--cache-from

?

要考虑作为缓存源的图像

--cgroup- parent

?

容器的可选父cgroup

--compress

false

使用gzip压缩构建上下文

--cpu-period

0

限制CPU CFS(完全公平调度程序)期限

- --cpu-quota

0

限制CPU CFS(完全公平调度程序)配额

--cpu-shares,-c

0

CPU份额(相对重量)

--cpuset-CPU

?

允许执行的CPU(0-3,0,1)

--cpuset-MEMS

?

允许执行的MEM(0-3,0,1)

--disable-content-trust

true

跳过图像验证

--file,-f

?

Dockerfile的名称(默认为'PATH / Dockerfile')

--force-RM

false

始终删除中间容器

--iidfile

?

将图像ID写入文件

--isolation

?

容器隔离技术

--label

?

设置图像的元数据

--memory, -m

0

内存限制

--memory-swap

0

交换限制等于内存加交换:'-1'以启用无限交换

--network

默认

在构建期间为RUN指令设置联网模式

--no-cache

false

构建图像时不要使用缓存

--pull

false

始终尝试拉取图像的较新版本

--quiet,-q

false

取消构建输出并在成功时打印图像ID

- R M

真正

成功构建后移除中间容器

--security-OPT

?

安全选项

--shm-size

0

/ dev / shm的大小

--squash

false

将新建的图层压缩到单个新图层中

--tag, -t

?

以'名称:标记'格式命名和可选的标记

--target

?

设置要构建的目标构建阶段。

--ulimit

?

Ulimit选项

父命令

命令

描述

docker

The base command for the Docker CLI.

扩展描述

docker build命令从 Dockerfile 和“上下文”构建 Docker 镜像。构建的上下文是指定位置PATH或位置中的一组文件URL。构建过程可以引用上下文中的任何文件。例如,您的构建可以使用 COPY 指令来引用上下文中的文件。

URL参数可以引用三种资源:Git 存储库,预打包的 tarball 环境和纯文本文件。

Git存储库

URL参数指向Git存储库的位置,存储库充当构建上下文。系统递归地获取存储库及其子模块。提交历史没有保存。首先将存储库拖到本地主机上的临时目录中。成功后,目录作为上下文发送到Docker守护进程。本地副本使您能够使用本地用户凭据、VPN等访问私有存储库。

注:如果URL参数包含一个片段,系统将使用git clone --recursive命令。

Git URL接受片段中的上下文配置,用冒号分隔:。第一部分代表Git将检出的引用,可以是分支,标记或远程引用。第二部分表示存储库内的子目录,将用作构建上下文。

例如,运行此命令以使用名为docker(在分支container*)

代码语言:javascript
复制
$ docker build https://github.com/docker/rootfs.git#container:docker

下表表示所有有效后缀及其构建上下文:

构建语法后缀

已用命令

构建已使用上下文

myrepo.git

refs/heads/master

/

myrepo.git#mytag

refs/tags/mytag

/

myrepo.git#mybranch

refs/heads/mybranch

/

myrepo.git#pull/42/head

refs/pull/42/head

/

myrepo.git#:myfolder

refs/heads/master

/myfolder

myrepo.git#master:myfolder

refs/heads/master

/myfolder

myrepo.git#mytag:myfolder

refs/tags/mytag

/myfolder

myrepo.git#mybranch:myfolder

refs/heads/mybranch

/myfolder

tarball上下文

如果将URL传递给远程tarball,则将URL本身发送到守护进程:

代码语言:javascript
复制
$ docker build http://server/context.tar.gz

下载操作将在运行Docker守护进程的主机上执行,它不一定是发出构建命令的主机。Docker守护进程将获取context.tar.gz并使用它作为构建上下文。Tarball上下文必须是符合标准tarUNIX格式的tar档案,并且可以使用'xz','bzip2','gzip'或'identity'(无压缩)格式中的任何一种进行压缩。

文本文件

而不是指定上下文,您可以传递一个DockerfileURL或者将文件导入VIASTDINDockerfileSTDIN*

代码语言:javascript
复制
$ docker build - < Dockerfile

通过Windows上的Powershell,您可以运行:

代码语言:javascript
复制
Get-Content Dockerfile | docker build -

如果您使用STDIN或指定一个URL指向一个纯文本文件时,系统将内容放入一个名为Dockerfile,任何-f--file选项被忽略。在这种情况下,没有上下文。

默认情况下,该docker build命令将查找Dockerfile构建上下文的根。使用-f--file,选项可以指定替代文件的路径。这在多个版本使用同一组文件的情况下很有用。路径必须是构建上下文中的文件。如果指定了相对路径,则它被解释为相对于上下文的根。

在大多数情况下,最好将每个Dockerfile放在一个空目录中。然后,只向该目录添加构建Dockerfile所需的文件。若要提高生成的性能,可以通过添加.dockerignore文件也放在那个目录下。有关创建一个的信息,请参见.dockerignore文件...

如果Docker客户端失去与守护进程的连接,则生成将被取消。如果您用CTRL-c或者码头客户因任何原因被杀。如果生成启动了一个在构建被取消时仍在运行的拉,则该拉也被取消。

实例

用路径构建

代码语言:javascript
复制
$ docker build .

Uploading context 10240 bytes
Step 1/3 : FROM busybox
Pulling repository busybox
 ---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2/3 : RUN ls -lh /
 ---> Running in 9c9e81692ae9
total 24
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 bin
drwxr-xr-x    5 root     root        4.0K Oct 19 00:19 dev
drwxr-xr-x    2 root     root        4.0K Oct 19 00:19 etc
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 lib
lrwxrwxrwx    1 root     root           3 Mar 12  2013 lib64 -> lib
dr-xr-xr-x  116 root     root           0 Nov 15 23:34 proc
lrwxrwxrwx    1 root     root           3 Mar 12  2013 sbin -> bin
dr-xr-xr-x   13 root     root           0 Nov 15 23:34 sys
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 tmp
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 usr
 ---> b35f4035db3f
Step 3/3 : CMD echo Hello world
 ---> Running in 02071fceb21b
 ---> f52f38b7823e
Successfully built f52f38b7823e
Removing intermediate container 9c9e81692ae9
Removing intermediate container 02071fceb21b

这个例子指定PATH.,则本地目录中的所有文件都得到tar并发送到Docker守护进程。该PATH指定在哪里可以找到文件上的docker守护程序生成的“背景”。请记住守护进程可能在远程计算机上运行,??并且在客户端(您正在运行的位置docker build)不会解析Dockerfile 。这意味着发送的所有文件PATH,不仅仅是在Dockerfile中列出的ADD文件。

将上下文从本地机器传输到Docker守护进程是docker客户端意味着当您看到“发送构建上下文”消息时。

如果希望在构建完成后保留中间容器,则必须使用--rm=false这不影响生成缓存。

用URL构建

代码语言:javascript
复制
$ docker build github.com/creack/docker-firefox

这将克隆GitHub存储库,并将克隆的存储库用作上下文。存储库根部的Dockerfile用作Dockerfile。可以使用git://git@计划。

代码语言:javascript
复制
$ 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

这会将URL http://server/ctx.tar.gz发送到Docker守护进程,Docker守护进程会下载并提取引用的tarball。 -f ctx / Dockerfile参数在ctx.tar.gz中指定用于构建映像的Dockerfile中的路径。 该Dockerfile中引用本地路径的任何ADD命令都必须与ctx.tar.gz内的根目录相关。 在上面的示例中,tarball包含一个目录ctx /,因此ADD ctx / container.cfg /操作按预期工作。

用 - 进行建立

代码语言:javascript
复制
$ docker build - < Dockerfile

这将从STDIN没有上下文的地方读取Dockerfile 。由于缺少上下文,任何本地目录的内容都不会发送到Docker守护进程。由于没有上下文,因此Dockerfile ADD仅在引用远程URL时才有效。

代码语言:javascript
复制
$ docker build - < context.tar.gz

这将为从STDIN支持的格式有:bzip 2、gzip和xz。

使用.dockerignore文件

代码语言:javascript
复制
$ docker build .

Uploading context 18.829 MB
Uploading context
Step 1/2 : FROM busybox
 ---> 769b9341d937
Step 2/2 : CMD echo Hello world
 ---> Using cache
 ---> 99cc1ad10469
Successfully built 99cc1ad10469
$ echo ".git" > .dockerignore
$ docker build .
Uploading context  6.76 MB
Uploading context
Step 1/2 : FROM busybox
 ---> 769b9341d937
Step 2/2 : CMD echo Hello world
 ---> Using cache
 ---> 99cc1ad10469
Successfully built 99cc1ad10469

此示例显示使用该.dockerignore文件.git从上下文中排除目录。其效果可以在上传的上下文的改变大小中看到。构建器参考包含有关创建.dockerignore文件的详细信息

标记图像(-t)

代码语言:javascript
复制
$ docker build -t vieux/apache:2.0 .

这将像前面的示例一样构建,但它会标记生成的图像。存储库名称将是vieux/apache,标签将会是2.0。详细了解有效标签。

可以将多个标记应用于图像。例如,可以应用latest标记到新构建的映像中,并添加引用特定版本的另一个标记。例如,将图像标记为whenry/fedora-jboss:latestwhenry/fedora-jboss:v2.1,使用以下方法:

代码语言:javascript
复制
$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .

指定一个Dockerfile(-f)

代码语言:javascript
复制
$ docker build -f Dockerfile.debug .

这将使用一个叫做Dockerfile.debug构建指令的文件来代替Dockerfile

代码语言:javascript
复制
$ curl example.com/remote/Dockerfile | docker build -f - .

上面的命令将使用当前目录作为构建上下文,并从stdin读取一个Dockerfile。

代码语言:javascript
复制
$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .
$ docker build -f dockerfiles/Dockerfile.prod  -t myapp_prod .

以上命令将.使用调试版本的a Dockerfile和使用生产版本一次两次构建当前构建上下文(由the指定)。

代码语言:javascript
复制
$ cd /home/me/myapp/some/dir/really/deep
$ docker build -f /home/me/myapp/dockerfiles/debug /home/me/myapp
$ docker build -f ../../../../dockerfiles/debug /home/me/myapp

这两个docker build命令也会这样做。它们都使用debug文件,而不是查找Dockerfile并将使用/home/me/myapp作为构建上下文的根。请注意debug在构建上下文的目录结构中,而不管如何在命令行中引用它。

注意: 如果文件或目录不存在于上传的上下文中,docker build将返回no such file or directory错误。如果没有上下文,或者您指定的文件位于主机系统的其他位置,则可能会发生这种情况。由于安全原因,上下文仅限于当前目录(及其子目录),并确保远程Docker主机上的可重复构建。这也是ADD ../file不能工作的原因。

使用自定义父级cgroup(-cgroup-parent)

docker build使用该--cgroup-parent选项运行时,构建中使用的容器将与相应的docker run标志一起运行。

在容器中设置ulimits(-ulimit)

使用该--ulimit选项docker build将使每个构建步骤的容器都使用这些--ulimit标志值启动。

设置构建时间变量(-build-arg)

您可以使用ENVDockerfile中的指令来定义变量值。这些值坚持在建成的形象。但是,往往坚持的内容不是你想要的。用户想要根据他们在哪个主机上构建图像来指定不同的变量。

一个很好的例子是http_proxy或提取中间文件的源版本。ARG指令允许Dockerfile作者定义用户可以在构建时使用--build-arg标志

代码语言:javascript
复制
$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .

此标志允许您传递像常规环境变量一样访问的构建时变量。RUNDockerfile的指令。而且,这些值不会在中间图像或最终映像中持久化,例如ENV价值是可以的。

使用此标志不会改变当ARG在构建过程中,来自Dockerfile的行将被回显。

有关使用ARGENV指令的详细信息,请参阅Dockerfile参考。

可选的安全选项(-security-opt)

该标志仅在Windows上运行的守护程序上受支持,并且只支持credentialspec选项。在credentialspec必须在格式file://spec.txtregistry://keyname

指定容器的隔离技术(隔离)

在Windows上运行Docker容器的情况下,此选项很有用。--isolation=<value>选项设置容器的隔离技术。在Linux上,唯一支持的是default使用Linux命名空间的选项。在Microsoft Windows上,您可以指定这些值:

描述

默认

使用Docker守护进程的--exec-opt指定的值。如果守护进程未指定隔离技术,则Microsoft Windows将使用进程作为其默认值。

处理

仅命名空间隔离。

hyperv

基于Hyper-V管理程序分区的隔离。

指定--isolation没有值的标志与设置--isolation="default"相同。

将条目添加到容器主机文件(-add-host)

您可以/etc/hosts使用一个或多个--add-host标志将其他主机添加到容器的文件中。此示例为名为以下的主机添加一个静态地址docker

代码语言:javascript
复制
$ docker build --add-host=docker:10.180.0.1 .

指定目标构建阶段(-target)

当构建具有多个构建阶段的Dockerfile时,--target可以根据名称指定中间构建阶段,作为结果映像的最后阶段。将跳过目标阶段之后的命令。

代码语言:javascript
复制
FROM debian AS build-env
...

FROM alpine AS production-env
...
代码语言:javascript
复制
$ docker build -t mybuildimage --target build-env .

压缩图像的图层(-squash)用于实验

概述

一旦图像被构建,将新的图层压缩成一个新的图层。压缩不会破坏任何现有的图像,而是创建一个新的图像与内容的挤压层。这实际上使它看起来像所有的Dockerfile命令是用一个单层创建的。此方法将保留生成缓存。

使用此选项意味着新图像将无法利用与其他图像的层共享,并可能使用更多的空间。

使用此选项,您可能会看到由于存储两个映像副本,一个用于具有所有缓存层的构建缓存,另一个用于压缩版本。

先决条件

此页面上的示例是在Docker 1.13中使用试验模式。

可以通过使用--experimental在启动Docker守护进程或设置experimental: truedaemon.json配置文件

默认情况下,实验模式被禁用。要查看当前配置,请使用docker version命令。

代码语言:javascript
复制
Server:
 Version:      1.13.1
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 06:35:24 2017
 OS/Arch:      linux/amd64
 Experimental: false

 [...]

要启用实验模式,用户需要重启启用实验标志的docker守护进程。

启用码头试验

从版本1.13.0开始,标准Docker二进制文件现在包含实验性功能。为了启用实验性功能,您需要启动带有--experimental标志的Docker守护进程。您也可以通过/etc/docker/daemon.json启用守护进程标志。例如

代码语言:javascript
复制
{
    "experimental": true
}

然后确保启用了实验标志:

代码语言:javascript
复制
$ docker version -f '{{.Server.Experimental}}'
true

--squash参数构建图像

以下是使用--squash参数构建docker的示例

代码语言:javascript
复制
FROM busybox
RUN echo hello > /hello
RUN echo world >> /hello
RUN touch remove_me /remove_me
ENV HELLO world
RUN rm /remove_me

一个名为的图像test是用--squash参数构建的。

代码语言:javascript
复制
$ docker build --squash -t test .

[...]

如果一切都是正确的,那么历史将会是这样的:

代码语言:javascript
复制
$ docker history test 

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4e10cb5b4cac        3 seconds ago                                                       12 B                merge sha256:88a7b0112a41826885df0e7072698006ee8f621c6ab99fca7fe9151d7b599702 to sha256:47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb
<missing>           5 minutes ago       /bin/sh -c rm /remove_me                        0 B
<missing>           5 minutes ago       /bin/sh -c #(nop) ENV HELLO=world               0 B
<missing>           5 minutes ago       /bin/sh -c touch remove_me /remove_me           0 B
<missing>           5 minutes ago       /bin/sh -c echo world >> /hello                 0 B
<missing>           6 minutes ago       /bin/sh -c echo hello > /hello                  0 B
<missing>           7 weeks ago         /bin/sh -c #(nop) CMD ["sh"]                    0 B
<missing>           7 weeks ago         /bin/sh -c #(nop) ADD file:47ca6e777c36a4cfff   1.113 MB

我们可以发现所有图层的名称都是<missing>,并且COMMENT有一个新图层merge

测试图像,检查是否/remove_me已经消失,确保hello\nworld已进入/hello,确保HELLOenvvar的值为world

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com