©
本文档使用 PHP中文网手册 发布
从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专门处理:它忽略任何具有默认操作的信号。因此,进程不会在
SIGINT
或SIGTERM
除非它被编码来这么做。
禁止在附加到启用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
(一个小写字母字符)
@
(在标志处)
[
(左括号)
\\
(两个反向斜线)
_
(下划线)
^
(脱字号;补注号)
这些a
,ctrl-a
,X
,或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
$ 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。
$ 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文件的详细信息
$ docker build -t vieux/apache:2.0 .
这将像前面的示例一样构建,但它会标记生成的图像。存储库名称将是vieux/apache
,标签将会是2.0
。详细了解有效标签。
可以将多个标记应用于图像。例如,可以应用latest
标记到新构建的映像中,并添加引用特定版本的另一个标记。例如,将图像标记为whenry/fedora-jboss:latest
和whenry/fedora-jboss:v2.1
,使用以下方法:
$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
$ 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
不能工作的原因。
当docker build
使用该--cgroup-parent
选项运行时,构建中使用的容器将与相应的docker run
标志一起运行。
使用该--ulimit
选项docker build
将使每个构建步骤的容器都使用这些--ulimit
标志值启动。
您可以使用ENV
Dockerfile中的指令来定义变量值。这些值坚持在建成的形象。但是,往往坚持的内容不是你想要的。用户想要根据他们在哪个主机上构建图像来指定不同的变量。
一个很好的例子是http_proxy
或提取中间文件的源版本。ARG
指令允许Dockerfile作者定义用户可以在构建时使用--build-arg标志
:
$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .
此标志允许您传递像常规环境变量一样访问的构建时变量。RUN
Dockerfile的指令。而且,这些值不会在中间图像或最终映像中持久化,例如ENV
价值是可以的。
使用此标志不会改变当ARG
在构建过程中,来自Dockerfile的行将被回显。
有关使用ARG
和ENV
指令的详细信息,请参阅Dockerfile参考。
该标志仅在Windows上运行的守护程序上受支持,并且只支持credentialspec
选项。在credentialspec
必须在格式file://spec.txt
或registry://keyname
。
在Windows上运行Docker容器的情况下,此选项很有用。--isolation=<value>
选项设置容器的隔离技术。在Linux上,唯一支持的是default
使用Linux命名空间的选项。在Microsoft Windows上,您可以指定这些值:
值 | 描述 |
---|---|
默认 | 使用Docker守护进程的--exec-opt指定的值。如果守护进程未指定隔离技术,则Microsoft Windows将使用进程作为其默认值。 |
处理 | 仅命名空间隔离。 |
hyperv | 基于Hyper-V管理程序分区的隔离。 |
指定--isolation
没有值的标志与设置--isolation="default"
相同。
您可以/etc/hosts
使用一个或多个--add-host
标志将其他主机添加到容器的文件中。此示例为名为以下的主机添加一个静态地址docker
:
$ docker build --add-host=docker:10.180.0.1 .
当构建具有多个构建阶段的Dockerfile时,--target
可以根据名称指定中间构建阶段,作为结果映像的最后阶段。将跳过目标阶段之后的命令。
FROM debian AS build-env...FROM alpine AS production-env...
$ docker build -t mybuildimage --target build-env .
一旦图像被构建,将新的图层压缩成一个新的图层。压缩不会破坏任何现有的图像,而是创建一个新的图像与内容的挤压层。这实际上使它看起来像所有的Dockerfile
命令是用一个单层创建的。此方法将保留生成缓存。
注使用此选项意味着新图像将无法利用与其他图像的层共享,并可能使用更多的空间。
注使用此选项,您可能会看到由于存储两个映像副本,一个用于具有所有缓存层的构建缓存,另一个用于压缩版本。
此页面上的示例是在Docker 1.13中使用试验模式。
可以通过使用--experimental
在启动Docker守护进程或设置experimental: true
在daemon.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
,确保HELLO
envvar的值为world
。