?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
從Dockerfile生成圖像
docker build [OPTIONS] PATH | URL | -
名字,簡(jiǎn)寫 | 默認(rèn) | 描述 |
---|---|---|
--add-host | 添加自定義的主機(jī)到IP映射(主機(jī):IP) | |
--build-arg | 設(shè)置構(gòu)建時(shí)間變量 | |
--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份額(相對(duì)重量) |
--cpuset-CPU | 允許執(zhí)行的CPU(0-3,0,1) | |
--cpuset-MEMS | 允許執(zhí)行的MEM(0-3,0,1) | |
--disable-content-trust | true | 跳過(guò)圖像驗(yàn)證 |
--file,-f | Dockerfile的名稱(默認(rèn)為'PATH / Dockerfile') | |
--force-RM | false | 始終刪除中間容器 |
--iidfile | 將圖像ID寫入文件 | |
--isolation | 容器隔離技術(shù) | |
--label | 設(shè)置圖像的元數(shù)據(jù) | |
--memory, -m | 0 | 內(nèi)存限制 |
--memory-swap | 0 | 交換限制等于內(nèi)存加交換:'-1'以啟用無(wú)限交換 |
--network | 默認(rèn) | 在構(gòu)建期間為RUN指令設(shè)置聯(lián)網(wǎng)模式 |
--no-cache | false | 構(gòu)建圖像時(shí)不要使用緩存 |
--pull | false | 始終嘗試?yán)D像的較新版本 |
--quiet,-q | false | 取消構(gòu)建輸出并在成功時(shí)打印圖像ID |
- R M | 真正 | 成功構(gòu)建后移除中間容器 |
--security-OPT | 安全選項(xiàng) | |
--shm-size | 0 | / dev / shm的大小 |
--squash | false | 將新建的圖層壓縮到單個(gè)新圖層中 |
--tag, -t | 以'名稱:標(biāo)記'格式命名和可選的標(biāo)記 | |
--target | 設(shè)置要構(gòu)建的目標(biāo)構(gòu)建階段。 | |
--ulimit | Ulimit選項(xiàng) |
將本地標(biāo)準(zhǔn)輸入,輸出和錯(cuò)誤流附加到正在運(yùn)行的容器
docker attach [OPTIONS] CONTAINER
名稱,縮寫 | 默認(rèn) | 描述 |
---|---|---|
--detach-keys | 重寫用于分離容器的密鑰序列 | |
--no-stdin | false | 不附加 STDIN |
--sig-proxy | true | 代理所有接收到的信號(hào)到過(guò)程中 |
命令 | 描述 |
---|---|
docker | 泊塢窗 CLI 的基本命令。 |
用于docker attach
使用容器的ID或名稱將終端的標(biāo)準(zhǔn)輸入,輸出和錯(cuò)誤(或三者的任意組合)附加到正在運(yùn)行的容器。這允許您查看其正在進(jìn)行的輸出或以交互方式控制它,就好像命令直接在您的終端中運(yùn)行一樣。
注:大
attach
命令將顯示ENTRYPOINT/CMD
過(guò)程。這可能看起來(lái)像是掛起附加命令,而實(shí)際上,進(jìn)程可能根本沒(méi)有與終端進(jìn)行交互。
您可以同時(shí)從Docker主機(jī)上的不同會(huì)話多次附加到同一包含的進(jìn)程。
要停止容器,請(qǐng)使用CTRL-c
。該密鑰序列發(fā)送SIGKILL
到容器。如果--sig-proxy
為真(默認(rèn)),則CTRL-c
發(fā)送一個(gè)SIGINT
到容器。您可以從容器中分離并使用CTRL-p CTRL-q
鍵序列保持運(yùn)行。
注:在容器中作為PID 1運(yùn)行的進(jìn)程被Linux專門處理:它忽略任何具有默認(rèn)操作的信號(hào)。因此,進(jìn)程不會(huì)在
SIGINT
或SIGTERM
除非它被編碼來(lái)這么做。
禁止在附加到啟用tty的容器(即:?jiǎn)?dòng)時(shí)-t
)時(shí)重定向docker attach
命令的標(biāo)準(zhǔn)輸入。
當(dāng)客戶端連接到容器的Stdio時(shí),請(qǐng)使用docker attach
,Docker使用~1MB內(nèi)存緩沖區(qū)來(lái)最大化應(yīng)用程序的吞吐量。如果填充了此緩沖區(qū),API連接的速度將開始影響進(jìn)程輸出寫入速度。這與其他應(yīng)用程序類似,如SSH。因此,不建議運(yùn)行性能關(guān)鍵的應(yīng)用程序,這些應(yīng)用程序在前臺(tái)通過(guò)緩慢的客戶端連接生成大量輸出。相反,用戶應(yīng)該使用docker logs
命令來(lái)訪問(wèn)日志。
如果需要,可以為DECHACH配置一個(gè)覆蓋Docker密鑰序列。如果Docker默認(rèn)序列與用于其他應(yīng)用程序的密鑰序列發(fā)生沖突,則此操作非常有用。有兩種方法可以定義您自己的分離密鑰序列,作為每個(gè)容器覆蓋或作為整個(gè)配置的配置屬性。
若要重寫單個(gè)容器的序列,請(qǐng)使用--detach-keys="<sequence>"
帶docker attach
命令。的格式<sequence>
不是一封信阿-Z,或ctrl-
與下列任何一項(xiàng)相結(jié)合:
a-z
(一個(gè)小寫字母字符)
@
(在標(biāo)志處)
[
(左括號(hào))
\\
(兩個(gè)反向斜線)
_
(下劃線)
^
(脫字號(hào);補(bǔ)注號(hào))
這些a
,ctrl-a
,X
,或ctrl-\\
的值是有效的密鑰序列的所有實(shí)施例。要為所有容器配置不同的配置默認(rèn)密鑰序列,請(qǐng)參閱配置文件部分。
$ 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
在第二個(gè)示例中,您可以看到bash
進(jìn)程返回的退出代碼也被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存儲(chǔ)庫(kù),并將克隆的存儲(chǔ)庫(kù)用作上下文。存儲(chǔ)庫(kù)根部的Dockerfile用作Dockerfile。可以使用git://
或git@
計(jì)劃。
$ 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
這會(huì)將URL http://server/ctx.tar.gz
發(fā)送到Docker守護(hù)進(jìn)程,Docker守護(hù)進(jìn)程會(huì)下載并提取引用的tarball。 -f ctx / Dockerfile
參數(shù)在ctx.tar.gz
中指定用于構(gòu)建映像的Dockerfile
中的路徑。 該Dockerfile
中引用本地路徑的任何ADD
命令都必須與ctx.tar.gz
內(nèi)的根目錄相關(guān)。 在上面的示例中,tarball包含一個(gè)目錄ctx /
,因此ADD ctx / container.cfg /
操作按預(yù)期工作。
$ docker build - < Dockerfile
這將從STDIN
沒(méi)有上下文的地方讀取Dockerfile 。由于缺少上下文,任何本地目錄的內(nèi)容都不會(huì)發(fā)送到Docker守護(hù)進(jìn)程。由于沒(méi)有上下文,因此Dockerfile ADD
僅在引用遠(yuǎn)程URL時(shí)才有效。
$ 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)建器參考包含有關(guān)創(chuàng)建.dockerignore文件的詳細(xì)信息
$ docker build -t vieux/apache:2.0 .
這將像前面的示例一樣構(gòu)建,但它會(huì)標(biāo)記生成的圖像。存儲(chǔ)庫(kù)名稱將是vieux/apache
,標(biāo)簽將會(huì)是2.0
。詳細(xì)了解有效標(biāo)簽。
可以將多個(gè)標(biāo)記應(yīng)用于圖像。例如,可以應(yīng)用latest
標(biāo)記到新構(gòu)建的映像中,并添加引用特定版本的另一個(gè)標(biāo)記。例如,將圖像標(biāo)記為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 .
這將使用一個(gè)叫做Dockerfile.debug
構(gòu)建指令的文件來(lái)代替Dockerfile
。
$ curl example.com/remote/Dockerfile | docker build -f - .
上面的命令將使用當(dāng)前目錄作為構(gòu)建上下文,并從stdin讀取一個(gè)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)建當(dāng)前構(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
這兩個(gè)docker build
命令也會(huì)這樣做。它們都使用debug
文件,而不是查找Dockerfile
并將使用/home/me/myapp
作為構(gòu)建上下文的根。請(qǐng)注意debug
在構(gòu)建上下文的目錄結(jié)構(gòu)中,而不管如何在命令行中引用它。
注意: 如果文件或目錄不存在于上傳的上下文中,
docker build
將返回no such file or directory
錯(cuò)誤。如果沒(méi)有上下文,或者您指定的文件位于主機(jī)系統(tǒng)的其他位置,則可能會(huì)發(fā)生這種情況。由于安全原因,上下文僅限于當(dāng)前目錄(及其子目錄),并確保遠(yuǎn)程Docker主機(jī)上的可重復(fù)構(gòu)建。這也是ADD ../file
不能工作的原因。
當(dāng)docker build
使用該--cgroup-parent
選項(xiàng)運(yùn)行時(shí),構(gòu)建中使用的容器將與相應(yīng)的docker run
標(biāo)志一起運(yùn)行。
使用該--ulimit
選項(xiàng)docker build
將使每個(gè)構(gòu)建步驟的容器都使用這些--ulimit
標(biāo)志值啟動(dòng)。
您可以使用ENV
Dockerfile中的指令來(lái)定義變量值。這些值堅(jiān)持在建成的形象。但是,往往堅(jiān)持的內(nèi)容不是你想要的。用戶想要根據(jù)他們?cè)谀膫€(gè)主機(jī)上構(gòu)建圖像來(lái)指定不同的變量。
一個(gè)很好的例子是http_proxy
或提取中間文件的源版本。ARG
指令允許Dockerfile作者定義用戶可以在構(gòu)建時(shí)使用--build-arg標(biāo)志
:
$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .
此標(biāo)志允許您傳遞像常規(guī)環(huán)境變量一樣訪問(wèn)的構(gòu)建時(shí)變量。RUN
Dockerfile的指令。而且,這些值不會(huì)在中間圖像或最終映像中持久化,例如ENV
價(jià)值是可以的。
使用此標(biāo)志不會(huì)改變當(dāng)ARG
在構(gòu)建過(guò)程中,來(lái)自Dockerfile的行將被回顯。
有關(guān)使用ARG
和ENV
指令的詳細(xì)信息,請(qǐng)參閱Dockerfile參考。
該標(biāo)志僅在Windows上運(yùn)行的守護(hù)程序上受支持,并且只支持credentialspec
選項(xiàng)。在credentialspec
必須在格式file://spec.txt
或registry://keyname
。
在Windows上運(yùn)行Docker容器的情況下,此選項(xiàng)很有用。--isolation=<value>
選項(xiàng)設(shè)置容器的隔離技術(shù)。在Linux上,唯一支持的是default
使用Linux命名空間的選項(xiàng)。在Microsoft Windows上,您可以指定這些值:
值 | 描述 |
---|---|
默認(rèn) | 使用Docker守護(hù)進(jìn)程的--exec-opt指定的值。如果守護(hù)進(jìn)程未指定隔離技術(shù),則Microsoft Windows將使用進(jìn)程作為其默認(rèn)值。 |
處理 | 僅命名空間隔離。 |
hyperv | 基于Hyper-V管理程序分區(qū)的隔離。 |
指定--isolation
沒(méi)有值的標(biāo)志與設(shè)置--isolation="default"
相同。
您可以/etc/hosts
使用一個(gè)或多個(gè)--add-host
標(biāo)志將其他主機(jī)添加到容器的文件中。此示例為名為以下的主機(jī)添加一個(gè)靜態(tài)地址docker
:
$ docker build --add-host=docker:10.180.0.1 .
當(dāng)構(gòu)建具有多個(gè)構(gòu)建階段的Dockerfile時(shí),--target
可以根據(jù)名稱指定中間構(gòu)建階段,作為結(jié)果映像的最后階段。將跳過(guò)目標(biāo)階段之后的命令。
FROM debian AS build-env...FROM alpine AS production-env...
$ docker build -t mybuildimage --target build-env .
一旦圖像被構(gòu)建,將新的圖層壓縮成一個(gè)新的圖層。壓縮不會(huì)破壞任何現(xiàn)有的圖像,而是創(chuàng)建一個(gè)新的圖像與內(nèi)容的擠壓層。這實(shí)際上使它看起來(lái)像所有的Dockerfile
命令是用一個(gè)單層創(chuàng)建的。此方法將保留生成緩存。
注使用此選項(xiàng)意味著新圖像將無(wú)法利用與其他圖像的層共享,并可能使用更多的空間。
注使用此選項(xiàng),您可能會(huì)看到由于存儲(chǔ)兩個(gè)映像副本,一個(gè)用于具有所有緩存層的構(gòu)建緩存,另一個(gè)用于壓縮版本。
此頁(yè)面上的示例是在Docker 1.13中使用試驗(yàn)?zāi)J健?/p>
可以通過(guò)使用--experimental
在啟動(dòng)Docker守護(hù)進(jìn)程或設(shè)置experimental: true
在daemon.json
配置文件
默認(rèn)情況下,實(shí)驗(yàn)?zāi)J奖唤?。要查看?dāng)前配置,請(qǐng)使用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 [...]
要啟用實(shí)驗(yàn)?zāi)J?,用戶需要重啟啟用?shí)驗(yàn)標(biāo)志的docker守護(hù)進(jìn)程。
從版本1.13.0開始,標(biāo)準(zhǔn)Docker二進(jìn)制文件現(xiàn)在包含實(shí)驗(yàn)性功能。為了啟用實(shí)驗(yàn)性功能,您需要啟動(dòng)帶有--experimental
標(biāo)志的Docker守護(hù)進(jìn)程。您也可以通過(guò)/etc/docker/daemon.json啟用守護(hù)進(jìn)程標(biāo)志。例如
{ "experimental": true}
然后確保啟用了實(shí)驗(yàn)標(biāo)志:
$ 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
一個(gè)名為的圖像test
是用--squash
參數(shù)構(gòu)建的。
$ docker build --squash -t test .[...]
如果一切都是正確的,那么歷史將會(huì)是這樣的:
$ 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有一個(gè)新圖層merge
。
測(cè)試圖像,檢查是否/remove_me
已經(jīng)消失,確保hello\nworld
已進(jìn)入/hello
,確保HELLO
envvar的值為world
。