?
This document uses PHP Chinese website manual Release
從Dockerfile生成圖像
docker build [OPTIONS] PATH | URL | -
名字,簡寫 | 默認 | 描述 |
---|---|---|
--add-host | 添加自定義的主機到IP映射(主機:IP) | |
--build-arg | 設置構(gòu)建時間變量 | |
--cache-from | 要考慮作為緩存源的圖像 | |
--cgroup- parent | 容器的可選父cgroup | |
--compress | false | 使用gzip壓縮構(gòu)建上下文 |
--cpu-period | 0 | 限制CPU CFS(完全公平調(diào)度程序)期限 |
- --cpu-quota | 0 | 限制CPU CFS(完全公平調(diào)度程序)配額 |
--cpu-shares,-c | 0 | CPU份額(相對重量) |
--cpuset-CPU | 允許執(zhí)行的CPU(0-3,0,1) | |
--cpuset-MEMS | 允許執(zhí)行的MEM(0-3,0,1) | |
--disable-content-trust | true | 跳過圖像驗證 |
--file,-f | Dockerfile的名稱(默認為'PATH / Dockerfile') | |
--force-RM | false | 始終刪除中間容器 |
--iidfile | 將圖像ID寫入文件 | |
--isolation | 容器隔離技術 | |
--label | 設置圖像的元數(shù)據(jù) | |
--memory, -m | 0 | 內(nèi)存限制 |
--memory-swap | 0 | 交換限制等于內(nèi)存加交換:'-1'以啟用無限交換 |
--network | 默認 | 在構(gòu)建期間為RUN指令設置聯(lián)網(wǎng)模式 |
--no-cache | false | 構(gòu)建圖像時不要使用緩存 |
--pull | false | 始終嘗試拉取圖像的較新版本 |
--quiet,-q | false | 取消構(gòu)建輸出并在成功時打印圖像ID |
- R M | 真正 | 成功構(gòu)建后移除中間容器 |
--security-OPT | 安全選項 | |
--shm-size | 0 | / dev / shm的大小 |
--squash | false | 將新建的圖層壓縮到單個新圖層中 |
--tag, -t | 以'名稱:標記'格式命名和可選的標記 | |
--target | 設置要構(gòu)建的目標構(gòu)建階段。 | |
--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
。該密鑰序列發(fā)送SIGKILL
到容器。如果--sig-proxy
為真(默認),則CTRL-c
發(fā)送一個SIGINT
到容器。您可以從容器中分離并使用CTRL-p CTRL-q
鍵序列保持運行。
注:在容器中作為PID 1運行的進程被Linux專門處理:它忽略任何具有默認操作的信號。因此,進程不會在
SIGINT
或SIGTERM
除非它被編碼來這么做。
禁止在附加到啟用tty的容器(即:啟動時-t
)時重定向docker attach
命令的標準輸入。
當客戶端連接到容器的Stdio時,請使用docker attach
,Docker使用~1MB內(nèi)存緩沖區(qū)來最大化應用程序的吞吐量。如果填充了此緩沖區(qū),API連接的速度將開始影響進程輸出寫入速度。這與其他應用程序類似,如SSH。因此,不建議運行性能關鍵的應用程序,這些應用程序在前臺通過緩慢的客戶端連接生成大量輸出。相反,用戶應該使用docker logs
命令來訪問日志。
如果需要,可以為DECHACH配置一個覆蓋Docker密鑰序列。如果Docker默認序列與用于其他應用程序的密鑰序列發(fā)生沖突,則此操作非常有用。有兩種方法可以定義您自己的分離密鑰序列,作為每個容器覆蓋或作為整個配置的配置屬性。
若要重寫單個容器的序列,請使用--detach-keys="<sequence>"
帶docker attach
命令。的格式<sequence>
不是一封信阿-Z,或ctrl-
與下列任何一項相結(jié)合:
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
命令返回給其調(diào)用者:
$ 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
發(fā)送到Docker守護進程,Docker守護進程會下載并提取引用的tarball。 -f ctx / Dockerfile
參數(shù)在ctx.tar.gz
中指定用于構(gòu)建映像的Dockerfile
中的路徑。 該Dockerfile
中引用本地路徑的任何ADD
命令都必須與ctx.tar.gz
內(nèi)的根目錄相關。 在上面的示例中,tarball包含一個目錄ctx /
,因此ADD ctx / container.cfg /
操作按預期工作。
$ docker build - < Dockerfile
這將從STDIN
沒有上下文的地方讀取Dockerfile 。由于缺少上下文,任何本地目錄的內(nèi)容都不會發(fā)送到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
從上下文中排除目錄。其效果可以在上傳的上下文的改變大小中看到。構(gòu)建器參考包含有關創(chuàng)建.dockerignore文件的詳細信息
$ docker build -t vieux/apache:2.0 .
這將像前面的示例一樣構(gòu)建,但它會標記生成的圖像。存儲庫名稱將是vieux/apache
,標簽將會是2.0
。詳細了解有效標簽。
可以將多個標記應用于圖像。例如,可以應用latest
標記到新構(gòu)建的映像中,并添加引用特定版本的另一個標記。例如,將圖像標記為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
構(gòu)建指令的文件來代替Dockerfile
。
$ curl example.com/remote/Dockerfile | docker build -f - .
上面的命令將使用當前目錄作為構(gòu)建上下文,并從stdin讀取一個Dockerfile。
$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .$ docker build -f dockerfiles/Dockerfile.prod -t myapp_prod .
以上命令將.
使用調(diào)試版本的a Dockerfile
和使用生產(chǎn)版本一次兩次構(gòu)建當前構(gòu)建上下文(由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
作為構(gòu)建上下文的根。請注意debug
在構(gòu)建上下文的目錄結(jié)構(gòu)中,而不管如何在命令行中引用它。
注意: 如果文件或目錄不存在于上傳的上下文中,
docker build
將返回no such file or directory
錯誤。如果沒有上下文,或者您指定的文件位于主機系統(tǒng)的其他位置,則可能會發(fā)生這種情況。由于安全原因,上下文僅限于當前目錄(及其子目錄),并確保遠程Docker主機上的可重復構(gòu)建。這也是ADD ../file
不能工作的原因。
當docker build
使用該--cgroup-parent
選項運行時,構(gòu)建中使用的容器將與相應的docker run
標志一起運行。
使用該--ulimit
選項docker build
將使每個構(gòu)建步驟的容器都使用這些--ulimit
標志值啟動。
您可以使用ENV
Dockerfile中的指令來定義變量值。這些值堅持在建成的形象。但是,往往堅持的內(nèi)容不是你想要的。用戶想要根據(jù)他們在哪個主機上構(gòu)建圖像來指定不同的變量。
一個很好的例子是http_proxy
或提取中間文件的源版本。ARG
指令允許Dockerfile作者定義用戶可以在構(gòu)建時使用--build-arg標志
:
$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .
此標志允許您傳遞像常規(guī)環(huán)境變量一樣訪問的構(gòu)建時變量。RUN
Dockerfile的指令。而且,這些值不會在中間圖像或最終映像中持久化,例如ENV
價值是可以的。
使用此標志不會改變當ARG
在構(gòu)建過程中,來自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管理程序分區(qū)的隔離。 |
指定--isolation
沒有值的標志與設置--isolation="default"
相同。
您可以/etc/hosts
使用一個或多個--add-host
標志將其他主機添加到容器的文件中。此示例為名為以下的主機添加一個靜態(tài)地址docker
:
$ docker build --add-host=docker:10.180.0.1 .
當構(gòu)建具有多個構(gòu)建階段的Dockerfile時,--target
可以根據(jù)名稱指定中間構(gòu)建階段,作為結(jié)果映像的最后階段。將跳過目標階段之后的命令。
FROM debian AS build-env...FROM alpine AS production-env...
$ docker build -t mybuildimage --target build-env .
一旦圖像被構(gòu)建,將新的圖層壓縮成一個新的圖層。壓縮不會破壞任何現(xiàn)有的圖像,而是創(chuàng)建一個新的圖像與內(nèi)容的擠壓層。這實際上使它看起來像所有的Dockerfile
命令是用一個單層創(chuàng)建的。此方法將保留生成緩存。
注使用此選項意味著新圖像將無法利用與其他圖像的層共享,并可能使用更多的空間。
注使用此選項,您可能會看到由于存儲兩個映像副本,一個用于具有所有緩存層的構(gòu)建緩存,另一個用于壓縮版本。
此頁面上的示例是在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二進制文件現(xiàn)在包含實驗性功能。為了啟用實驗性功能,您需要啟動帶有--experimental
標志的Docker守護進程。您也可以通過/etc/docker/daemon.json啟用守護進程標志。例如
{ "experimental": true}
然后確保啟用了實驗標志:
$ docker version -f '{{.Server.Experimental}}'true
--squash
參數(shù)構(gòu)建圖像以下是使用--squash
參數(shù)構(gòu)建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
參數(shù)構(gòu)建的。
$ 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
我們可以發(fā)現(xiàn)所有圖層的名稱都是<missing>
,并且COMMENT有一個新圖層merge
。
測試圖像,檢查是否/remove_me
已經(jīng)消失,確保hello\nworld
已進入/hello
,確保HELLO
envvar的值為world
。