目录搜索
文字
分享

描述

从Dockerfile生成图像

使用

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 attach [OPTIONS] CONTAINER

备选方案

名称,缩写

默认

描述

--detach-keys


重写用于分离容器的密钥序列

--no-stdin

false

不附加 STDIN

--sig-proxy

true

代理所有接收到的信号到过程中

父命令

命令

描述

docker

泊坞窗 CLI 的基本命令。

扩展描述

用于docker attach使用容器的ID或名称将终端的标准输入,输出和错误(或三者的任意组合)附加到正在运行的容器。这允许您查看其正在进行的输出或以交互方式控制它,就好像命令直接在您的终端中运行一样。

注:attach命令将显示ENTRYPOINT/CMD过程。这可能看起来像是挂起附加命令,而实际上,进程可能根本没有与终端进行交互。

您可以同时从Docker主机上的不同会话多次附加到同一包含的进程。

要停止容器,请使用CTRL-c。该密钥序列发送SIGKILL到容器。如果--sig-proxy为真(默认),则CTRL-c发送一个SIGINT到容器。您可以从容器中分离并使用CTRL-p CTRL-q键序列保持运行。

注:在容器中作为PID 1运行的进程被Linux专门处理:它忽略任何具有默认操作的信号。因此,进程不会在SIGINTSIGTERM除非它被编码来这么做。

禁止在附加到启用tty的容器(即:启动时-t)时重定向docker attach命令的标准输入。

当客户端连接到容器的Stdio时,请使用docker attach,Docker使用~1MB内存缓冲区来最大化应用程序的吞吐量。如果填充了此缓冲区,API连接的速度将开始影响进程输出写入速度。这与其他应用程序类似,如SSH。因此,不建议运行性能关键的应用程序,这些应用程序在前台通过缓慢的客户端连接生成大量输出。相反,用户应该使用docker logs命令来访问日志。

重写分离序列

如果需要,可以为DECHACH配置一个覆盖Docker密钥序列。如果Docker默认序列与用于其他应用程序的密钥序列发生冲突,则此操作非常有用。有两种方法可以定义您自己的分离密钥序列,作为每个容器覆盖或作为整个配置的配置属性。

若要重写单个容器的序列,请使用--detach-keys="<sequence>"docker attach命令。的格式<sequence>不是一封信阿-Z,或ctrl-与下列任何一项相结合:

  • a-z (一个小写字母字符)

  • @ (在标志处)

  • [ (左括号)

  • \\ (两个反向斜线)

  • _ (下划线)

  • ^ (脱字号;补注号)

这些actrl-aX,或ctrl-\\的值是有效的密钥序列的所有实施例。要为所有容器配置不同的配置默认密钥序列,请参阅配置文件部分。

示例

附加到正在运行的容器并从中分离

$ docker run -d --name topdemo ubuntu /usr/bin/top -b

$ docker attach topdemo

top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombieCpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    373572k total,   355560k used,    18012k free,    27872k buffers
Swap:   786428k total,        0k used,   786428k free,   221740k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 1 root      20   0 17200 1116  912 R    0  0.3   0:00.03 top

 top - 02:05:55 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
 Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 Mem:    373572k total,   355244k used,    18328k free,    27872k buffers
 Swap:   786428k total,        0k used,   786428k free,   221776k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND       1 root      20   0 17208 1144  932 R    0  0.3   0:00.03 top


 top - 02:05:58 up  3:06,  0 users,  load average: 0.01, 0.02, 0.05
 Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie Cpu(s):  0.2%us,  0.3%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 Mem:    373572k total,   355780k used,    17792k free,    27880k buffers
 Swap:   786428k total,        0k used,   786428k free,   221776k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND      1 root      20   0 17208 1144  932 R    0  0.3   0:00.03 top^C$

$ echo $?0$ docker ps -a | grep topdemo

7998ac8581f9        ubuntu:14.04        "/usr/bin/top -b"   38 seconds ago      Exited (0) 21 seconds ago                          topdemo

获取容器命令的退出代码

在第二个示例中,您可以看到bash进程返回的退出代码也被docker attach命令返回给其调用者:

    $ docker run --name test -d -it debian

    275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab

    $ docker attach test

    root@f38c87f2a42d:/# exit 13

    exit

    $ echo $?    13

    $ docker ps -a | grep test

    275c44472aeb        debian:7            "/bin/bash"         26 seconds ago      Exited (13) 17 seconds ago                         test

用URL构建

$ docker build github.com/creack/docker-firefox

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

$ 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 /操作按预期工作。

用 - 进行建立

$ docker build - < Dockerfile

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

$ docker build - < context.tar.gz

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

使用.dockerignore文件

$ 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)

$ docker build -t vieux/apache:2.0 .

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

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

$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .

指定一个Dockerfile(-f)

$ docker build -f Dockerfile.debug .

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

$ curl example.com/remote/Dockerfile | docker build -f - .

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

$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .$ docker build -f dockerfiles/Dockerfile.prod  -t myapp_prod .

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

$ 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标志

$ 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

$ docker build --add-host=docker:10.180.0.1 .

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

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

FROM debian AS build-env...FROM alpine AS production-env...
$ docker build -t mybuildimage --target build-env .

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

概述

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

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

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

先决条件

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

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

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

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启用守护进程标志。例如

{    "experimental": true}

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

$ docker version -f '{{.Server.Experimental}}'true

--squash参数构建图像

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

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参数构建的。

$ docker build --squash -t test .[...]

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

$ 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

上一篇:docker attach下一篇:docker checkpoint