【現(xiàn)學(xué)現(xiàn)忘Docker基礎(chǔ)】— 30.CMD和ENTRYPOINT區(qū)別

CMD指令和ENTRYPOINT指令都是指定一個容器啟動時要運行的命令往产。

1搀捷、CMD指令和ENTRYPOINT指令說明

CMD指令戳杀, 支持三種格式:

CMD ["executable","param1","param2"] 使用 exec 執(zhí)行宁否,推薦方式晌杰;
 
CMD command param1 param2 在 /bin/sh 中執(zhí)行桂敛,提供給需要交互的應(yīng)用功炮;
 
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數(shù);

每個Dockerfile只能生效一條CMD指令术唬。如果指定了多條CMD指令薪伏,只有最后一條生效。

如果用戶啟動容器時候指定了運行的命令碴开,則會覆蓋掉CMD指定的命令毅该。

ENTRYPOINT指令,支持兩種格式:

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2(shell中執(zhí)行)潦牛。

每個Dockerfile中只能生效一個ENTRYPOINT指令眶掌,當有多個ENTRYPOINT指令時,只有最后一個起效巴碗。

如果用戶啟動容器時候指定了運行的命令朴爬,不會被docker run執(zhí)行的命令參數(shù)覆蓋。(追加效果:docker run命令之后的參數(shù)橡淆,會被當做參數(shù)傳遞給ENTRYPOINT召噩,之后形成新的命令組合)

2、CMD指令只有最后一條生效的原因

CMD指令是一個容器的默認的可執(zhí)行命令逸爵。也就是容器啟動以后具滴,默認執(zhí)行的命令。(默認是重點)

換句話說师倔,給出了CMD指令的一個角色定位构韵,它主要作用是定義默認的容器啟動后執(zhí)行的命令

提示:

這也就是網(wǎng)上所說,只有最后一條CMD指令會生效疲恢,之前的都會被覆蓋掉凶朗。

就是因為CMD指令的角色定位就是默認,如果你不進行額外指定显拳,那么就執(zhí)行CMD指令棚愤。否則,你要自己指定了命令杂数,那么就不會執(zhí)行CMD指令宛畦,這也就是相當于CMD指令會被覆蓋。

而ENTRYPOINT指令耍休,才是正統(tǒng)地用于定義容器啟動以后的執(zhí)行體刃永,從名字上我們也可以看出,entrypoint 入口點的意思羊精,一個容器的“入口”斯够。

3、CMD指令演示

我們以contos鏡像為基礎(chǔ)喧锦,對該鏡像進行修改读规。

(1)準備測試環(huán)境

進入宿主機/home/mydockerfile目錄中,創(chuàng)建Dockerfil文件Dockerfile_cmd燃少。

# mydockerfile目錄中創(chuàng)建Dockerfile_cmd文件
[root@192 mydockerfile]# pwd
/home/mydockerfile
[root@192 mydockerfile]# touch Dockerfile_cmd

編輯Dockerfile_cmd文件束亏,內(nèi)容如下:

FROM centos # 繼承了本地的centos鏡像
CMD ["ls","-a"] # 執(zhí)行l(wèi)s -a 命令

說明:我們之前CMD執(zhí)行都是/bin/bash,這回改成ls -a命令是一樣的阵具,就是啟動容器后執(zhí)行ls -a命令碍遍。

根據(jù)Dockerfile_cmd生成cmd鏡像。

[root@192 mydockerfile]# docker build -f /home/mydockerfile/Dockerfile_cmd -t wukong/cmd:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
 ---> Running in e34a0fc14329
Removing intermediate container e34a0fc14329
 ---> de211d4ca7f3
Successfully built de211d4ca7f3
Successfully tagged wukong/cmd:1.0

(2)進行驗證

運行wukong/cmd鏡像阳液,查看結(jié)果怕敬。

# 查看本地Docker鏡像
[root@192 mydockerfile]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
wukong/cmd      1.0       de211d4ca7f3   2 minutes ago   209MB
wokong_centos   1.6       6441f63090d4   3 hours ago     291MB
centos          latest    300e315adb2f   3 months ago    209MB

# 直接運行該容器,查看結(jié)果帘皿,輸出了默認工作目錄中的內(nèi)容东跪。
[root@192 mydockerfile]# docker run wukong/cmd:1.0 
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 容器啟動,執(zhí)行完ls -a 命令后鹰溜,就會停止虽填。
[root@192 mydockerfile]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

接下來,我們在docker run命令后曹动,加入-l命令斋日,我們再來查看一下結(jié)果。

[root@192 mydockerfile]# docker run wukong/cmd:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

說明:

我的意思是想追加一個-l參數(shù)墓陈,讓容器啟動后桑驱,執(zhí)行ls -al命令竭恬。結(jié)果我們看到是跛蛋,可執(zhí)行文件找不到的報錯熬的,exec: "-l":executable file not found

這就是我們之前說過的赊级,跟在鏡像名后面的是command(命令)押框,運行時會替換CMD的默認值。也就是-l參數(shù)替換了Dockerfile文件中的CMD ["ls","-a"]命令理逊,而不是添加在原來的命令里橡伞。

而單獨的-l參數(shù)不是Linux命令,不能單獨的命令晋被,自然找不到兑徘,所以就報錯了。

所以綜上所述羡洛,CMD指令會被docker run之后的參數(shù)替換挂脑。

那么如果我們希望加入-i這個參數(shù),就必須重新完整的輸入整個命令欲侮,如下:

[root@192 mydockerfile]# docker run wukong/cmd:1.0 ls -al
total 0
drwxr-xr-x.   1 root root   6 Mar 20 11:13 .
drwxr-xr-x.   1 root root   6 Mar 20 11:13 ..
-rwxr-xr-x.   1 root root   0 Mar 20 11:13 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Mar 20 11:13 dev
drwxr-xr-x.   1 root root  66 Mar 20 11:13 etc
drwxr-xr-x.   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x.   2 root root   6 Nov  3 15:22 media
drwxr-xr-x.   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x.   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x. 122 root root   0 Mar 20 11:13 proc
dr-xr-x---.   2 root root 162 Dec  4 17:37 root
drwxr-xr-x.  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx.   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x.  13 root root   0 Mar 20 06:42 sys
drwxrwxrwt.   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 262 Dec  4 17:37 var

4崭闲、ENTRYPOINT指令演示

通過上面CMD指令演示相似。

我們以contos鏡像為基礎(chǔ)威蕉,對該鏡像進行修改刁俭。

(1)準備測試環(huán)境

進入宿主機/home/mydockerfile目錄中,創(chuàng)建Dockerfil文件Dockerfile_entrypoint韧涨。

# mydockerfile目錄中創(chuàng)建Dockerfile_entrypoint文件
[root@192 mydockerfile]# pwd
/home/mydockerfile
[root@192 mydockerfile]# touch Dockerfile_entrypoint

編輯Dockerfile_entrypoint文件牍戚,內(nèi)容如下:

FROM centos # 繼承了本地的centos鏡像
ENTRYPOINT ["ls","-a"] # 執(zhí)行l(wèi)s -a 命令

根據(jù)Dockerfile_entrypoint生成entrypoint鏡像。

[root@192 mydockerfile]# docker build -f /home/mydockerfile/Dockerfile_entrypoint -t wukong/entrypoint:1.0 .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in ecd4a636d8be
Removing intermediate container ecd4a636d8be
 ---> e641401b4ea5
Successfully built e641401b4ea5
Successfully tagged wukong/entrypoint:1.0

(2)進行驗證

運行wukong/entrypoint鏡像虑粥,查看結(jié)果如孝。

# 查看本地Docker鏡像
[root@192 mydockerfile]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
wukong/entrypoint   1.0       e641401b4ea5   2 minutes ago   209MB
wukong/cmd          1.0       adda4543a402   3 minutes ago   209MB
wokong_centos       1.6       6441f63090d4   4 hours ago     291MB
centos              latest    300e315adb2f   3 months ago    209MB

# 直接運行該容器,查看結(jié)果舀奶,輸出了默認工作目錄中的內(nèi)容暑竟。
[root@192 mydockerfile]# docker run wukong/entrypoint:1.0 
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

接下來,我們在docker run命令后育勺,加入-l命令但荤,我們再來查看一下結(jié)果。

[root@192 mydockerfile]# docker run wukong/entrypoint:1.0 -l
total 0
drwxr-xr-x.   1 root root   6 Mar 20 12:03 .
drwxr-xr-x.   1 root root   6 Mar 20 12:03 ..
-rwxr-xr-x.   1 root root   0 Mar 20 12:03 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Mar 20 12:03 dev
drwxr-xr-x.   1 root root  66 Mar 20 12:03 etc
drwxr-xr-x.   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx.   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x.   2 root root   6 Nov  3 15:22 media
drwxr-xr-x.   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x.   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x. 124 root root   0 Mar 20 12:03 proc
dr-xr-x---.   2 root root 162 Dec  4 17:37 root
drwxr-xr-x.  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx.   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x.  13 root root   0 Mar 20 06:42 sys
drwxrwxrwt.   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 262 Dec  4 17:37 var

說明:想給Dockerfile文件中的ENTRYPOINT ["ls","-a"]命令追加一個-l參數(shù)涧至,讓容器啟動后執(zhí)行ls -al命令腹躁,結(jié)果順利執(zhí)行。

結(jié)論:這就說明了南蓬,ENTRYPOINT指令是可以在容器啟動的時候追加命令纺非。

Dockerfile中很多命令的功能都十分的相似哑了,我們需要了解它們的區(qū)別,我們最好的學(xué)習(xí)就是對比他們烧颖,然后測試效果弱左。

以上就是CMD指令和ENTRYPOINT指令的區(qū)別。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炕淮,一起剝皮案震驚了整個濱河市拆火,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涂圆,老刑警劉巖们镜,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異润歉,居然都是意外死亡模狭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門踩衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚼鹉,“玉大人,你說我怎么就攤上這事。” “怎么了搁凸?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宴树。 經(jīng)常有香客問我,道長晶疼,這世上最難降的妖魔是什么酒贬? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮翠霍,結(jié)果婚禮上锭吨,老公的妹妹穿的比我還像新娘。我一直安慰自己寒匙,他們只是感情好零如,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锄弱,像睡著了一般考蕾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上会宪,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天肖卧,我揣著相機與錄音,去河邊找鬼掸鹅。 笑死塞帐,一個胖子當著我的面吹牛拦赠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葵姥,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼荷鼠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牌里?” 一聲冷哼從身側(cè)響起颊咬,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牡辽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敞临,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡态辛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挺尿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏黑。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖编矾,靈堂內(nèi)的尸體忽然破棺而出熟史,到底是詐尸還是另有隱情,我是刑警寧澤窄俏,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布蹂匹,位于F島的核電站,受9級特大地震影響凹蜈,放射性物質(zhì)發(fā)生泄漏限寞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一仰坦、第九天 我趴在偏房一處隱蔽的房頂上張望履植。 院中可真熱鬧,春花似錦悄晃、人聲如沸玫霎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庶近。三九已至,卻和暖如春眷细,著一層夾襖步出監(jiān)牢的瞬間拦盹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工溪椎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留普舆,地道東北人恬口。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像沼侣,于是被迫代替她去往敵國和親祖能。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容