中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker鏡像怎么生成

發布時間:2022-05-26 15:31:21 來源:億速云 閱讀:289 作者:iii 欄目:大數據

這篇文章主要介紹“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鏡像怎么生成
 

從上面例子可以看出,一個 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 指令的參數


沒有 entrypointentrypoint exec_entry p1_entryentrypoint [“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鏡像怎么生成”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沾益县| 八宿县| 新营市| 九江市| 南乐县| 静安区| 聂拉木县| 安顺市| 虎林市| 兴义市| 远安县| 杭锦旗| 奉节县| 阳原县| 阿坝县| 融水| 阳信县| 夏河县| 寿阳县| 广饶县| 文昌市| 潼关县| 新宾| 日土县| 织金县| 长顺县| 壤塘县| 眉山市| 钟山县| 卫辉市| 德清县| 柏乡县| 谢通门县| 龙里县| 崇义县| 四平市| 中西区| 屏山县| 万全县| 万年县| 白沙|