您好,登錄后才能下訂單哦!
這篇文章主要介紹“Docker鏡像怎么生成”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Docker鏡像怎么生成”文章能幫助大家解決問題。
docker 有兩種方式來創建一個容器鏡像:
創建一個容器,運行若干命令,再使用 docker commit 來生成一個新的鏡像。不建議使用這種方案。
創建一個 dockerfile 然后再使用 docker build 來創建一個鏡像。大多人會使用 dockerfile 來創建鏡像。
1. docker build 生成鏡像
1.1 生成過程實例
在使用 dockerfile 創建容器之前,需要先準備一個 dockerfile 文件,然后運行 docker build 命令來創建鏡像。我們通過下面的例子來看看docker 創建容器的過程。
from ubuntu:14.04 maintainer sammy "sammy@sammy.com" run apt-get update run apt-get -y install ntp expose 5555 cmd ["/usr/sbin/ntpd"]
這是一個非常簡單的dockerfile,它的目的是基于 ubuntu 14.04 基礎鏡像安裝 ntp 從而生成一個新的鏡像。看看其過程:
root@devstack:/home/sammy/ntponubuntu# docker build -t sammy_ntp2 . sending build context to docker daemon 2.048 kb step 1 : from ubuntu:14.04 ---> 4a725d3b3b1c step 2 : maintainer sammy "sammy@sammy.com" ---> using cache ---> c4299e3f774c step 3 : run apt-get update ---> using cache ---> 694a19d54103 step 4 : run apt-get -y install ntp ---> running in 9bd153c65a76 reading package lists... ... fetched 561 kb in 10s (51.1 kb/s) selecting previously unselected package libedit2:amd64. (reading database ... 11558 files and directories currently installed.) ... processing triggers for libc-bin (2.19-0ubuntu6.9) ... processing triggers for ureadahead (0.100.0-16) ... ---> 9cc05cf6f48d removing intermediate container 9bd153c65a76 step 5 : expose 5555 ---> running in eb4633151d98 ---> f5c96137bec9 removing intermediate container eb4633151d98 step 6 : cmd /usr/sbin/ntpd ---> running in e81b1eae3678 ---> af678df648bc removing intermediate container e81b1eae3678 successfully built af678df648bc
dockerfile 中的每個步驟都會對應每一個 docker build 輸出中的 step。
step 1:from ubuntu:14.04
獲取基礎鏡像 ubuntu:14.04. docker 首先會在本地查找,如果找到了,則直接利用;否則從 docker registry 中下載。在第一次使用這個基礎鏡像的時候,docker 會從 docker hub 中下載這個鏡像,并保存在本地:
step 1 : from ubuntu:14.04 14.04: pulling from library/ubuntu 862a3e9af0ae: pull complete 6498e51874bf: pull complete 159ebdd1959b: pull complete 0fdbedd3771a: pull complete 7a1f7116d1e3: pull complete digest: sha256:5b5d48912298181c3c80086e7d3982029b288678fccabf2265899199c24d7f89 status: downloaded newer image for ubuntu:14.04 ---> 4a725d3b3b1c
以后再使用的時候就直接使用這個鏡像而不再需要下載了。
step 2:maintainer sammy ""
本例中依然是從 cache 中環境新的鏡像。在第一次的時候,docker 會創建一個臨時的容器 1be8f33c1846,然后運行 maintainer 命令,再使用 docker commit 生成新的鏡像
step 2 : maintainer sammy "sammy@sammy.com" ---> running in 1be8f33c1846 ---> c4299e3f774c
通過這個臨時容器的過程(create -> commit -> destroy),生成了新的鏡像 c4299e3f774c:
2016-09-16t21:58:09.010886393+08:00 container create 1be8f33c18469f089d1eee8c444dad1ff0c7309be82767092082311379245358 (image=sha256:4a725d3b3b1cc18c8cbd05358ffbbfedfe1eb947f58061e5858f08e2899731ee, name=focused_poitras)
2016-09-16t21:58:09.060071206+08:00 container commit 1be8f33c18469f089d1eee8c444dad1ff0c7309be82767092082311379245358 (comment=, image=sha256:4a725d3b3b1cc18c8cbd05358ffbbfedfe1eb947f58061e5858f08e2899731ee, name=focused_poitras)
2016-09-16t21:58:09.071988068+08:00 container destroy 1be8f33c18469f089d1eee8c444dad1ff0c7309be82767092082311379245358 (image=sha256:4a725d3b3b1cc18c8cbd05358ffbbfedfe1eb947f58061e5858f08e2899731ee, name=focused_poitras)
這個鏡像是基于 ubuntu 14.04 基礎鏡像生成的,layers 沒有變化,只是元數據 cmd 發生了改變:
"cmd": [ "/bin/sh", "-c", "#(nop) ", "maintainer sammy \"sammy@sammy.com\"" ]
因此可以認為只是鏡像的元數據發生了改變。生成的新的鏡像作為中間鏡像會被保存在 cache 中。
step 3: run apt-get update
本例中docker 仍然從緩存中獲取了鏡像。在第一次的時候,docker 仍然是通過創建臨時容器在執行 docker commit 的方式來創建新的鏡像:
step 3 : run apt-get update
---> running in 8b3b97af3bd7 ign http://archive.ubuntu.com trusty inrelease get:1 http://archive.ubuntu.com trusty-updates inrelease [65.9 kb] ... get:22 http://archive.ubuntu.com trusty/universe amd64 packages [7589 kb] fetched 22.2 mb in 16min 21s (22.6 kb/s) reading package lists... ---> 694a19d54103 removing intermediate container 8b3b97af3bd7
通過以上步驟,生成了新的中間鏡像 694a19d54103,它也會被保存在緩存中。你可以使用 docker inspect 694a19d54103 命令查看該中間鏡像,但是無法在docker images 列表中找到它,這是因為 docker images 默認隱藏了中間狀態的鏡像,因此你需要使用 docker images -a 來獲取它:
root@devstack:/home/sammy# docker images -a | grep 694a19d54103 <none> <none> 694a19d54103 11 hours ago 210.1 mb
該鏡像和原始鏡像相比,多了一個 layer,它保存的是 apt-get update 命令所帶來的變化:
"rootfs": { "type": "layers", "layers": [ "sha256:102fca64f92471ff7fca48e55807ae2471502822ba620292b0a06ebcab907cf4", "sha256:24fe29584c046f2a88f7f566dd0bf7b08a8c0d393dfad8370633b0748bba8cbc", "sha256:530d731d21e1b1bbe356d70d3bca4d72d76fed89e90faab271d29bd58c8ccea4", "sha256:344f56a35ff9fc747ada7d2b88bd21c49b2ec404872662cbaf0a65201873c0c6", "sha256:ffb6ddc7582aa7e2e73f102df3ffcd272e59b7cf3f7abefe08d11a7c85dea53a", "sha256:a1afe95c99b39c30b5c1d3e8fda451bd3f066be304616197f1046e64cf6cda93" #這一層是新加的 ] }
step 4: run apt-get -y install ntp
和上面 step 3 過程一樣,這個步驟也會通過創建臨時容器,執行該命令,再使用 docker commit 命令生成一個中間鏡像 9cc05cf6f48d 。和上面步驟生成的鏡像相比,它又多了一層:
root@devstack:/home/sammy# docker images -a | grep 9cc05cf6f48d <none> <none> 9cc05cf6f48d 10 hours ago 212.8 mb root@devstack:/home/sammy# docker inspect --format={{'.rootfs.layers'}} 9cc05cf6f48d [sha256:102fca64f92471ff7fca48e55807ae2471502822ba620292b0a06ebcab907cf4 sha256:24fe29584c046f2a88f7f566dd0bf7b08a8c0d393dfad8370633b0748bba8cbc sha256:530d731d21e1b1bbe356d70d3bca4d72d76fed89e90faab271d29bd58c8ccea4 sha256:344f56a35ff9fc747ada7d2b88bd21c49b2ec404872662cbaf0a65201873c0c6 sha256:ffb6ddc7582aa7e2e73f102df3ffcd272e59b7cf3f7abefe08d11a7c85dea53a sha256:a1afe95c99b39c30b5c1d3e8fda451bd3f066be304616197f1046e64cf6cda93 sha256:a93086f33a2b7ee18eec2454b468141f95a403f5081284b6f177f83cdb3d54ba]
step 5: expose 5555
這一步和上面的 step 2 一樣,docker 生成了一個臨時容器,執行 expose 55 命令,再通過 docker commit 創建了中間鏡像 f5c96137bec9。該鏡像的 layers 沒有變化,但是元數據發生了一些變化,包括:
"exposedports": { "5555/tcp": {} } "cmd": [ "/bin/sh", "-c", "#(nop) ", "expose 5555/tcp" ]
step 6: cmd ["/usr/sbin/ntpd"]
這一步和上面的步驟相同,最終它創建了鏡像 af678df648bc,該鏡像只是修改了 cmd 元數據:
"cmd": [ "/bin/sh", "-c", "#(nop) ", "cmd [\"/usr/sbin/ntpd\"]" ]
該鏡像也是docker 根據本 dockerfile 生成的最終鏡像。它也出現在了 docker images 結果中:
root@devstack:/home/sammy# docker images | grep af678df648bc sammy_ntp2 latest af678df648bc 11 hours ago 212.8 mb
我們可以使用 docker history 命令查看該鏡像中每一層的信息:
root@devstack:/home/sammy/ntponubuntu# docker history af678df648bc image created created by size comment af678df648bc 16 hours ago /bin/sh -c #(nop) cmd ["/usr/sbin/ntpd"] 0 b f5c96137bec9 16 hours ago /bin/sh -c #(nop) expose 5555/tcp 0 b 9cc05cf6f48d 16 hours ago /bin/sh -c apt-get -y install ntp 2.679 mb 694a19d54103 16 hours ago /bin/sh -c apt-get update 22.17 mb c4299e3f774c 17 hours ago /bin/sh -c #(nop) maintainer sammy "sammy@sa 0 b 4a725d3b3b1c 3 weeks ago /bin/sh -c #(nop) cmd ["/bin/bash"] 0 b <missing> 3 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'doc 7 b <missing> 3 weeks ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kb <missing> 3 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 b <missing> 3 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 194.6 kb <missing> 3 weeks ago /bin/sh -c #(nop) add file:ada91758a31d8de3c7 187.8 mb
以上過程說明:
容器鏡像包括元數據和文件系統,其中文件系統是指對基礎鏡像的文件系統的修改,元數據不影響文件系統,只是會影響容器的配置
每個步驟都會生成一個新的鏡像,新的鏡像與上一次的鏡像相比,要么元數據有了變化,要么文件系統有了變化而多加了一層
docker 在需要執行指令時通過創建臨時鏡像,運行指定的命令,再通過 docker commit 來生成新的鏡像
docker 會將中間鏡像都保存在緩存中,這樣將來如果能直接使用的話就不需要再從頭創建了。關于鏡像緩存,請搜索相關文檔。
1.2 docker 鏡像分層,cow 和 鏡像大小(size)
1.2.1 鏡像分層和容器層
從上面例子可以看出,一個 docker 鏡像是基于基礎鏡像的多層疊加,最終構成和容器的 rootfs (根文件系統)。當 docker 創建一個容器時,它會在基礎鏡像的容器層之上添加一層新的薄薄的可寫容器層。接下來,所有對容器的變化,比如寫新的文件,修改已有文件和刪除文件,都只會作用在這個容器層之中。因此,通過不拷貝完整的 rootfs,docker 減少了容器所占用的空間,以及減少了容器啟動所需時間。
1.2.2 cow 和鏡像大小
cow,copy-on-write 技術,一方面帶來了容器啟動的快捷,另一方也造成了容器鏡像大小的增加。每一次 run 命令都會在鏡像上增加一層,每一層都會占用磁盤空間。舉個例子,在 ubuntu 14.04 基礎鏡像中運行 run apt-get upgrade 會在保留基礎層的同時再創建一個新層來放所有新的文件,而不是修改老的文件,因此,新的鏡像大小會超過直接在老的文件系統上做更新時的文件大小。因此,為了減少鏡像大小起見,所有文件相關的操作,比如刪除,釋放和移動等,都需要盡可能地放在一個 run 指令中進行。
比如說,通過將上面的示例 dockerfile 修改為:
from ubuntu:14.04 maintainer sammy "sammy@sammy.com" run apt-get update && apt-get -y install ntp expose 5555 cmd ["/usr/sbin/ntpd"]
結果產生的鏡像,不僅層數少了一層(7 -> 6),而且大小減少了 0.001m :),因為這個例子比較特殊,文件都是添加,而沒有更新,因此size 的下降非常小。
1.2.3 使用容器需要避免的一些做法
下面列舉了一些在使用容器時需要避免的做法,包括:
不要在容器中保存數據(don't store data in containers)
將應用打包到鏡像再部署而不是更新到已有容器(don't ship your application in two pieces)
不要產生過大的鏡像 (don't create large images)
不要使用單層鏡像 (don't use a single layer image)
不要從運行著的容器上產生鏡像 (don't create images from running containers )
不要只是使用 “latest”標簽 (don't use only the “latest” tag)
不要在容器內運行超過一個的進程 (don't run more than one process in a single container )
不要在容器內保存 credentials,而是要從外面通過環境變量傳入 ( don't store credentials in the image. use environment variables)
不要使用 root 用戶跑容器進程(don't run processes as a root user )
不要依賴于ip地址,而是要從外面通過環境變量傳入 (don't rely on ip addresses )
2. dockerfile 語法
上面的步驟說明了 docker 可以通過讀取 dockerfile 的內容來生成容器鏡像。dockerfile 的每一行都是 instruction arguments 格式,即 “指令 參數”。關于 dockerfile 的預防,請參考 。下面只是就一些主要的指令做一些說明。
2.1 幾個主要指令
2.1.1 add 和 copy
add:將 host 上的文件拷貝到或者將網絡上的文件下載到容器中的指定目錄
# usage: add [source directory or url] [destination directory] add /my_app_folder /my_app_folder
例子:
from ubuntu:14.04 maintainer sammy liu <sammy.liu@unknow.com> add temp dockfile entrypoint top
add 指令會將本地 temp 目錄中的文件拷貝到容器的 dockfile 目錄下面,從而在鏡像中增加一個 layer。在未指定絕對路徑的時候,會放到 workdir 目錄下面。
root@cc2a5605f905:/# ls dockfile/ dockerfile-add dockerfile-cmd dockerfile-env dockerfile-ports dockerfile-user dockerfile-user-h root@cc2a5605f905:/# pwd /
那兩者有什么區別呢?
add 多了2個功能, 下載url和對支持的壓縮格式的包進行解壓. 其他都一樣。比如 add /tmp/main.go 會將文件從因特網上方下載下來,add /foo.tar.gz /tmp/ 會將壓縮文件解壓再copy過去
如果你不希望壓縮文件拷貝到container后會被解壓的話, 那么使用copy。
如果需要自動下載url并拷貝到container的話, 請使用add
2.1.2 cmd
cmd:在容器被創建后執行的命令,和 run 不同,它是在構造容器時候所執行的命令
# usage 1: cmd application "argument", "argument", .. cmd "echo" "hello docker!"
cmd 有三種格式:
cmd ["executable","param1","param2"] (like an exec, preferred form)
cmd ["param1","param2"] (作為 entrypoint 的參數)
cmd command param1 param2 (作為 shell 運行)
一個dockerfile里只能有一個cmd,如果有多個,只有最后一個生效。
2.1.3 entrypoint
entrypoint :設置默認應用,會保證每次容器被創建后該應用都會被執行。cmd 和 entrypoint 的關系會在下面詳細解釋。
2.1.4 env:設置環境變量,可以使用多次
# usage: env key value env server_works 4
設置了后,后續的run命令都可以使用,并且會作為容器的環境變量。舉個例子,下面是 dockfile:
from ubuntu:14.04 env abc=1 env def=2 entrypoint top
生成鏡像:docker build -t envimg4 -f dockerfile-env . 其元數據包括了這兩個環境變量:
"env": [ "path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "abc=1", "def=2" ],
啟動容器:docker run -it --name envc41 envimg4。也能看到:
"env": [ "path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "abc=1", "def=2" ]
進入容器:能看到定義的 abc 和 def 變量
root@devstack:/home/sammy/ntponubuntu# docker exec -it envc41 bash root@ba460e0e9dc4:/# echo $abc root@ba460e0e9dc4:/# echo $def
2.1.5 expose :向容器外暴露一個端口
# usage: expose [port] expose 8080
2.1.6 from:指定進行的基礎鏡像,必須是第一條指令
# usage: from [image name] from ubuntu
2.1.7 maintainer:可以在任意地方使用,設置鏡像的作者
# usage: maintainer [name] maintainer authors_name
2.1.8 run:運行命令,結果會生成鏡像中的一個新層
# usage: run [command] run aptitude install -y ntp
2.1.9 user:設置該鏡像的容器的主進程所使用的用戶,以及后續 run, cmd 和 entrypoint 指令運行所使用的用戶
語法:
# usage: user [uid] user 751
dockerfile 中的默認用戶是基礎鏡像中所使用的用戶。比如,你的鏡像是從一個使用非 root 用戶 sammy 的鏡像繼承而來的,那么你的 dockerfile 中 run 指定運行的命令的用戶就會使用 sammy 用戶。
舉例:
(1)創建 dockerfile 文件
root@devstack:/home/sammy/dockerfile# cat dockerfile-user from ubuntu:14.04 user 1000 entrypoint top
(2)創建鏡像:docker build -t dockerfile-user-1000 -f dockerfile-user .
(3)啟動容器:docker run -it --name c-user-1000-3 dockerfile-user-1000 top
能看出來當前用戶id 為 1000:
pid user pr ni virt res shr s %cpu %mem time+ command 1 1000 20 0 4440 648 548 s 0.0 0.0 0:00.00 sh 5 1000 20 0 19840 1296 984 r 0.0 0.1 0:00.00 top
(4)基于該鏡像再創造一個鏡像,然后再啟動一個容器,可以發現容器中進程所使用的用戶id 同樣為 1000.
2.1.10 volume:允許容器訪問host上某個目錄
# usage: volume ["/dir_1", "/dir_2" ..] volume ["/my_files"]
2.1.11 workdir:設置 cmd 所指定命令的執行目錄
# usage: workdir /path workdir ~/
2.1.12 healthcheck: 容器健康檢查
這是 docker 1.12 版本中新引入的指令,其語法為 healthcheck [options] cmd command。 來看一個例子:
from ubuntu:14.04 maintainer sammy liu <sammy.liu@unknow.com> run apt-get update run apt-get -y install curl expose 8888 cmd while true; do echo 'hello world' | nc -l -p 8888; done healthcheck --interval=10s --timeout=2s cmd curl -f http://localhost:8888/ || exit 1
在啟動容器后,其health 狀態首先是 starting,然后在過了10秒做了第一次健康檢查成功后,變為 healthy 狀態。
root@devstack:/home/sammy/dockerfile# docker ps | grep c-health2 4c459eef1894 img-health2 "/bin/sh -c 'while tr" 7 seconds ago up 6 seconds (health: starting) 8888/tcp c-health2 root@devstack:/home/sammy/dockerfile# docker ps | grep c-health2 4c459eef1894 img-health2 "/bin/sh -c 'while tr" 9 seconds ago up 8 seconds (health: starting) 8888/tcp c-health2 root@devstack:/home/sammy/dockerfile# docker ps | grep c-health2 4c459eef1894 img-health2 "/bin/sh -c 'while tr" 11 seconds ago up 11 seconds (healthy) 8888/tcp c-health2
需要注意的是 cmd 是在容器之內運行的,因此,你需要確保其命令或者腳本存在于容器之內并且可以被運行。
2.2 幾個比較繞的地方
2.2.1 expose 和 docker run -p -p 之間的關系
容器的端口必須被發出(publish)出來后才能被外界使用。dockerfile 中的 expose 只是“標記”某個端口會被暴露出來,只有在使用了 docker run -p 或者 -p 后,端口才會被“發出”出來,此時端口才能被使用。
舉例:
(1)dockerfile
from ubuntu:14.04 maintainer sammy liu <sammy.liu@unknow.com> cmd while true; do echo 'hello world' | nc -l -p 8888; done
(2)創建鏡像:docker build -t no-exposed-ports -f dockerfile-ports .
(3)啟動容器1:docker run -d --name no-exposed-ports1 no-exposed-ports。此容器沒有 exposed 和 published 任何端口。
(4)啟動容器2:docker run -d --name no-exposed-ports2 -p 8888:8888 no-exposed-ports
此時容器的 8888 端口被發布為主機上的 8888 端口:
"ports": { "8888/tcp": [ { "hostip": "0.0.0.0", "hostport": "8888" } ] }
該端口會正確返回:
root@devstack:/home/sammy/dockerfile# telnet 0.0.0.0 8888 trying 0.0.0.0... connected to 0.0.0.0. escape character is '^]'. hello world connection closed by foreign host.
(5)使用 -p 參數:docker run -d --name no-exposed-ports3 -p no-exposed-ports
此時沒有任何端口被 published,說明 docker 在使用了 “-p” 情形下只是自動將 exposed 的端口 published。
(6)使用 -p 加上一個不存在的端口:docker run -d --name no-exposed-ports4 -p 8889:8889 no-exposed-ports
此時,8889 端口會被暴露,但是沒法使用。說明 -p 會將沒有 exposed 的端口自動 exposed 出來。
(7)修改 dockerfile 為:
from ubuntu:14.04 maintainer sammy liu <sammy.liu@unknow.com> expose 8888 cmd while true; do echo 'hello world' | nc -l -p 8888; done
創建鏡像exposed-ports, 再運行 docker run -d --name exposed-ports1 -p exposed-ports 創建一個容器,此時 8888 端口自動被 published 為主機上的 32776 端口:
"ports": { "8888/tcp": [ { "hostip": "0.0.0.0", "hostport": "32776" } ] }
可見:
expose或者--expose只是為其他命令提供所需信息的元數據,或者只是告訴容器操作人員有哪些已知選擇。它只是作為記錄機制,也就是告訴用戶哪些端口會提供服務。它保存在容器的元數據中。
使用 -p 發布特定端口。如果該端口已經被 exposed,則發布它;如果它還沒有被 exposed,則它會被 exposed 和 published。docker 不會檢查容器端口的正確性。
使用 -p 時 docker 會自動將所有已經被 exposed 的端口發出出來。
2.2.2 cmd 和 entrypoint
這兩個指令都指定了運行容器時所運行的命令。以下是它們共存的一些規則:
dockerfile 至少需要指定一個 cmd 或者 entrypoint 指令
cmd 可以用來指定 entrypoint 指令的參數
沒有 entrypoint | entrypoint exec_entry p1_entry | entrypoint [“exec_entry”, “p1_entry”] | |
沒有 cmd | 錯誤,不允許 | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
cmd [“exec_cmd”, “p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry exec_cmd p1_cmd | exec_entry p1_entry exec_cmd p1_cmd |
cmd [“p1_cmd”, “p2_cmd”] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry p1_cmd p2_cmd | exec_entry p1_entry p1_cmd p2_cmd |
cmd exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
備注 | 只有 cmd 時,執行 cmd 定義的指令 | cmd 和 entrypoint 都存在時,cmd 的指令作為 entrypoint 的參數 |
舉例:
(1)同時有 cmd 和 entrypoint
from ubuntu:14.04 maintainer sammy liu <sammy.liu@unknow.com> cmd top entrypoint ps
此時會運行的指令為 /bin/sh -c ps /bin/sh -c top
但是實際上只是運行了 ps:
root@devstack:/home/sammy/dockerfile# /bin/sh -c ps /bin/sh -c top pid tty time cmd pts/3 00:00:00 su pts/3 00:00:00 bash pts/3 00:00:00 sh pts/3 00:00:00 ps root@devstack:/home/sammy/dockerfile# /bin/sh -c ps pid tty time cmd pts/3 00:00:00 su pts/3 00:00:00 bash pts/3 00:00:00 sh pts/3 00:00:00 ps
(2)cmd 作為 entrypoint 的參數
from ubuntu:14.04 maintainer sammy liu <sammy.liu@unknow.com> cmd ["-n", "10"] entrypoint top
啟動容器后運行的命令為 /bin/sh -c top -n 10.
關于“Docker鏡像怎么生成”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。