Ddockerfile裏的CMD和ENTRYPOINT的區別(圖文介紹,超詳細)

Dockerfile中的ENTRYPOINT指令和CMD指令都可以設置容器啓動時要執行的命令,但用途是有略微不同的。

ENTRYPOINT指令和CMD指令雖然是在Dockerfile中定義,但是在構建鏡像的時候並不會被執行,只有在執行docker run命令啓動容器時纔會起作用。

1。在Dockerfile中,只能有一個ENTRYPOINT指令,如果有多個ENTRYPOINT指令則以最後一個爲準。
2。在Dockerfile中,只能有一個CMD指令,如果有多個CMD指令則以最後一個爲準。
3。在Dockerfile中,ENTRYPOINT指令或CMD指令,至少必有其一。

1. ENTRYPOINT指令

首先,執行docker run如果帶有其他命令參數,不會覆蓋ENTRYPOINT指令。

不過,docker run的–entrypoint可以覆蓋Dockerfile中ENTRYPOINT設置的命令,後續文章詳述。

1) exec格式用法(推薦)

ENTRYPOINT [“top”,"-b", “-H”]
exec格式,也被稱爲JSON風格[“command”,“arg1”]。

在創建容器實例執行docker run命令時,設置的任何命令參數或CMD指令的命令,都將作爲ENTRYPOINT指令的命令參數,追加到ENTRYPOINT指令的命令之後。

如,在Dockerfile中有如上ENTRYPOINT指令的情況下,執行docker run <container_name> -v啓動容器。則容器啓動後執行的第一條完整命令如下:

top -b -H -v

即將-v作爲top的追加參數。

2) shell格式用法

ENTRYPOINT top -b -H
這種格式屏蔽追加任何參數,即CMD指令或docker run … 的參數都將被忽略。

採用shell格式,在創建容器後會首先調用Shell,即自動在命令前面追加/bin/sh -c。如,對於上述定義,在容器啓動時執行的第一條命令如下:

/bin/sh -c top -b -H

這樣,ENTRYPOINT指令設置的top命令就不是容器中的第一個進程PID 1,這樣在容器停止的時候就無法收到系統的SIGTERM信號。要想收到SIGTERM信號,務必使用Bash的內置exec命令使得top的PID 1,定義ENTRYPOINT指令如下:

ENTRYPOINT exec top -b -H

CMD

意思是,cmd給出的是一個容器的默認的可執行體。也就是容器啓動以後,默認的執行的命令。重點就是這個“默認”。意味着,如果docker run沒有指定任何的執行命令或者dockerfile裏面也沒有entrypoint,那麼,就會使用cmd指定的默認的執行命令執行。同時也從側面說明了entrypoint的含義,它纔是真正的容器啓動以後要執行命令。
所以這句話就給出了cmd命令的一個角色定位,它主要作用是默認的容器啓動執行命令。(注意不是“全部”作用)

這也是爲什麼大多數網上博客論壇說的“cmd會被覆蓋”,其實爲什麼會覆蓋?因爲cmd的角色定位就是默認,如果你不額外指定,那麼就執行cmd的命令,否則呢?只要你指定了,那麼就不會執行cmd,也就是cmd會被覆蓋。

shell form,即沒有中括號的形式。那麼命令command默認是在“/bin/sh -c”下執行的。比如下面的dockerfile:
	FROM centos
 
	CMD echo "美少女萬華鏡"

在這裏插入圖片描述
如果帶中括號的話,這時,命令沒有再任何shell終端環境下,我們要執行shell,就必須加入到中括號中。
需要注意,採用中括號形式,那麼第一個參數必須是命令的全路徑才行。而且,一個dockerfile至多只能有一個cmd,如果有多個,只有最後一個生效。
官網推薦採用這種方法。

	FROM centos
	ENV name=美少女萬華鏡之罪與罰
	CMD ["/bin/echo","hello,$name"]

在這裏插入圖片描述
如果再run後面添加了參數,那麼默認的CMD就會被覆蓋
在這裏插入圖片描述
命令行和shell。
先看命令行模式,也就是帶中括號的。和cmd的中括號形式是一致的,但是這裏貌似是在shell的環境下執行的,與cmd有區別。

2。如果run後面沒有額外的參數,但是cmd有,那麼cmd的全部內容會作爲entrypoint的參數

FROM centos
CMD ["勿忘草與永遠的少女"]
ENTRYPOINT ["echo"]

在這裏插入圖片描述

1。如果run命令後面有參數,那麼run後面的全部都會作爲entrypoint的參數

```bash
FROM centos
CMD ["勿忘草與永遠的少女"]
ENTRYPOINT ["echo"]

在這裏插入圖片描述
這同時是cmd的第二種用法。這也是網上說的entrypoint不會被覆蓋。當然如果要在run裏面覆蓋,也是有辦法的,使用–entrypoint即可。

1。加了中括號爲exec寫法(如圖)

該寫法不能實現變量

在這裏插入圖片描述

結果:

在這裏插入圖片描述

2。不加中括號爲shell寫法(如圖)

該寫法可以實現變量

在這裏插入圖片描述

結果:

在這裏插入圖片描述

3。如果用exec寫法還想實現變量,就需要在裏面加shell寫法(如圖)

注意,這裏先說下思路,但在理清思路之前先看下sh -c的作用sh -c的必要性不懂的可以點擊藍色字體看一下。

很明顯中括號裏面的參數使用引號包起來的,空格之間用逗號隔開,然後需要實現變量的話,是把shell命令放在同一個引號內

在這裏插入圖片描述

結果

在這裏插入圖片描述

喜歡的話,記得點贊喲,23333

在這裏插入圖片描述

發佈了13 篇原創文章 · 獲贊 8 · 訪問量 578
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章