Dockerfile的ENTRYPOINT和CMD

Dockerfile的ENTRYPOINT和CMD都是用來定義命令的執(zhí)行入口象踊。

  1. 定義ENTRYPOINT
$ cat Dockerfile 
FROM oraclelinux
ADD ./docker-entry.sh   /docker-entry.sh
ENTRYPOINT /docker-entry.sh

$ cat docker-entry.sh
#!/usr/bin/env bash
echo "Entry of ENTRYPOINT, ARGS[#]=$#"
for ((i = 0; i <= $#; i++ )); do
  echo "ENTRYPOINT ARGS[${i}]=[${!i}]"
done

$ docker build -t testimage

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=0

在docker run的時候ENTRYPOINT指定的命令被調(diào)用了谨究。

  1. 定義CMD
$ cat Dockerfile 
FROM oraclelinux
ADD ./docker-cmd.sh   /docker-cmd.sh
CMD /docker-cmd.sh

$ cat docker-cmd.sh
#!/usr/bin/env bash
echo "Entry of CMD, ARGS[#]=$#"
for ((i = 0; i <= $#; i++ )); do
  echo "CMD ARGS[${i}]=[${!i}]"
done

$ docker build -t testimage

$ docker run --rm testimage
Entry of CMD, ARGS[#]=0

這里看起來菇怀,ENTRYPOINT和CMD的行為是一樣的咕痛,沒有啥區(qū)分麻惶。

  1. 同時定義ENTRYPOINT和CMD
$ cat Dockerfile 
FROM oraclelinux
ADD ./docker-cmd.sh   /docker-cmd.sh
ADD ./docker-entry.sh   /docker-entry.sh
CMD        /docker-cmd.sh
ENTRYPOINT /docker-entry.sh

$ docker build -t testimage

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=0
  • 同時定義了ENTRYPOINT和CMD時,CMD被忽略宪拥。
  1. ENTRYPOINT和CMD的兩種寫法

4.1 SHELL
格式:<ENTRYPOINT|CMD> executable param1 param2 ...
4.2 EXEC
格式:<ENTRYPOINT|CMD> ["executable", "param1", "param2", ...]

  1. 使用EXEC的方式重新執(zhí)行上面三個case

5.1 定義ENTRYPOINT

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=0

5.2 定義CMD

$ docker run --rm testimage
Entry of CMD, ARGS[#]=0

5.3 同時定義ENTRYPOINT和CMD

Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[/docker-cmd.sh]

看到?jīng)]有5.3這里和前面使用SHELL格式的有重大不一樣仿野,CMD的內(nèi)容被作為參數(shù)傳遞給了ENTRYPOINT,雖然目前ENTRYPOINT沒有用到她君,但是我們知道就可以用了脚作。

  1. 使用run自帶命令

6.1 ENTRYPOINT + SHELL格式

$ docker run --rm testimage date
Entry of ENTRYPOINT, ARGS[#]=0
ENTRYPOINT ARGS[0]=[/docker-entry.sh]

6.2 CMD + SHELL格式

$ docker run --rm testimage date
Sun Dec 30 04:44:33 UTC 2018

6.3 ENTRYPOINT + CMD + SHELL格式

$ docker run --rm testimage date
Entry of ENTRYPOINT, ARGS[#]=0
ENTRYPOINT ARGS[0]=[/docker-entry.sh]

6.4 ENTRYPOINT + EXEC格式

$ docker run --rm testimage date
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[date]

6.5 CMD + EXEC格式

$ docker run --rm testimage date
Sun Dec 30 04:47:12 UTC 2018

6.6 ENTRYPOINT + CMD + EXEC格式

$ docker run --rm testimage date
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[date]
  1. 總結(jié)

7.1. ENTRYPOINT和CMD都可以用來指定容器的入口命令。
7.2 ENTRYPOINT具有優(yōu)先權(quán)

  • 如果定義了ENTRYPOINT缔刹,那么執(zhí)行ENTRYPOINT球涛,忽略CMD
  • 如果沒有定義ENTRYPOINT,那么執(zhí)行CMD校镐;如果CMD也沒有則失敗亿扁。

7.3 在EXEC模式下,CMD會被作為ARG[1]傳遞給ENTRYPOINT

  • 這樣ENTRYPOINT可以決定是否調(diào)用CMD的內(nèi)容鸟廓。
  • 在SHELL模式下則不會从祝。
  • 如果沒有ENTRYPOINT,如前所述引谜,則CMD直接被執(zhí)行了牍陌。

7.3 docker run的時候如果后面指定命令,那么這個命令是CMD的替換员咽。

  • 規(guī)則遵從CMD的處理流程毒涧。

7.4 因此建議ENTRYPOINT和CMD均采用EXEC的調(diào)用方式

  • 這樣CMD的內(nèi)容可以被ENTRYPOINT調(diào)用,而且
  • 原始CMD的內(nèi)容可以在命令行被替換贝室。

完整例子:

$ cat Dockerfile
FROM oraclelinux

ADD ./docker-cmd.sh     /docker-cmd.sh
ADD ./docker-entry.sh   /docker-entry.sh

ENTRYPOINT  [ "/docker-entry.sh" ]
CMD         [ "/docker-cmd.sh" ]

$ docker build . -t testimage

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[/docker-cmd.sh]
$@=[/docker-cmd.sh]
Entry of CMD, ARGS[#]=0
CMD ARGS[0]=[/docker-cmd.sh]

$ docker run --rm testimage date
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[date]
$@=[date]
Sun Dec 30 05:03:34 UTC 2018

$ docker run --rm testimage date "+%s"
Entry of ENTRYPOINT, ARGS[#]=2
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[date]
ENTRYPOINT ARGS[2]=[+%s]
$@=[date +%s]
1546146222
  1. EXEC模式的缺陷

8.1 EXEC不能使用環(huán)境變量

例如在SHELL模式下:

$ cat Dockerfile
FROM oraclelinux

ADD ./docker-entry.sh   /docker-entry.sh

ENV VAR Hello

ENTRYPOINT  "/docker-entry.sh" "${VAR}"

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[Hello]
$@=[Hello]

而同樣的功能如果在EXEC模式下:

$ cat Dockerfile
FROM oraclelinux

ADD ./docker-entry.sh   /docker-entry.sh

ENV VAR Hello

ENTRYPOINT  [ "/docker-entry.sh", "${VAR}" ]

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[${VAR}]
$@=[${VAR}]

這個環(huán)境變量$VAR沒有被替換掉契讲,而是源文本的方式穿下去了。

解決這個問題的辦法使用"bash -c"來調(diào)用ENTRYPOINT指令:

$ cat Dockerfile
FROM oraclelinux

ADD ./docker-entry.sh   /docker-entry.sh

ENV VAR Hello

ENTRYPOINT  [ "/bin/bash", "-c", "/docker-entry.sh ${VAR}" ]

$ docker run --rm testimage
Entry of ENTRYPOINT, ARGS[#]=1
ENTRYPOINT ARGS[0]=[/docker-entry.sh]
ENTRYPOINT ARGS[1]=[Hello]
$@=[Hello]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末档玻,一起剝皮案震驚了整個濱河市怀泊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌误趴,老刑警劉巖霹琼,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凉当,居然都是意外死亡枣申,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門看杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忠藤,“玉大人,你說我怎么就攤上這事楼雹∧:ⅲ” “怎么了尖阔?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長榨咐。 經(jīng)常有香客問我介却,道長,這世上最難降的妖魔是什么块茁? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任齿坷,我火速辦了婚禮,結(jié)果婚禮上数焊,老公的妹妹穿的比我還像新娘永淌。我一直安慰自己,他們只是感情好佩耳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布遂蛀。 她就那樣靜靜地躺著,像睡著了一般蚕愤。 火紅的嫁衣襯著肌膚如雪答恶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天萍诱,我揣著相機(jī)與錄音悬嗓,去河邊找鬼。 笑死裕坊,一個胖子當(dāng)著我的面吹牛包竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播籍凝,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼周瞎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饵蒂?” 一聲冷哼從身側(cè)響起声诸,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎退盯,沒想到半個月后彼乌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渊迁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年慰照,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉朽。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毒租,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出箱叁,到底是詐尸還是另有隱情墅垮,我是刑警寧澤惕医,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站噩斟,受9級特大地震影響曹锨,放射性物質(zhì)發(fā)生泄漏孤个。R本人自食惡果不足惜剃允,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齐鲤。 院中可真熱鬧斥废,春花似錦、人聲如沸给郊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淆九。三九已至统锤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炭庙,已是汗流浹背饲窿。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焕蹄,地道東北人逾雄。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像腻脏,于是被迫代替她去往敵國和親鸦泳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • Dockerfile 有兩個啟動配置永品, CMD 和 ENTRYPOINT 做鹰, 可以在 Dockerfile 中來配...
    JaeGwen閱讀 12,891評論 1 1
  • 透過別人的故事症见,看自己喂走。首先,這個別人得是自己所欣賞的人谋作,不然就沒有寫下去的意義了芋肠。 今天白楊師姐在“百人百天陪伴...
    顏妍陪你堅(jiān)持閱讀 543評論 2 2
  • 一首歌的時間,做一個“逃兵”遵蚜。走過的路帖池、讀過的書奈惑、身體所經(jīng)歷過的疼痛,他們?nèi)妓銛?shù)睡汹。細(xì)膩的心肴甸、亂飛的思緒,沒心沒肺...
    醬醬子閱讀 235評論 0 0
  • 辛棄疾懷詩囚巴。 岳鵬舉志詞原在。 看宋朝、又上愁眉彤叉。 可嘆未江山一統(tǒng), 偏安地庶柿,國分離。 古史盡聞悲秽浇。 今人當(dāng)謹(jǐn)思浮庐。 洞...
    西山有晴雪閱讀 1,719評論 31 65
  • 讓品清告訴大家為什么?這么愛三草這個品牌,并3年如一日堅(jiān)持著我的熱愛柬焕,堅(jiān)持著我的分享?? 三草兩木發(fā)展史? 蟹老板...
    品微閱讀 198評論 0 0