Dockerfile 指令 功能 三 (CMD)

CMD 指令的格式和 RUN 相似,也是兩種格式:

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
  • 參數(shù)列表格式:CMD ["參數(shù)1", "參數(shù)2"...]狸相。在指定了 ENTRYPOINT 指令后薛匪,用 CMD 指定具體的參數(shù)。

容器是一個(gè)進(jìn)程。那么在啟動(dòng)容器的時(shí)候,就需要指定所運(yùn)行的程序及參數(shù)苞俘。
CMD 指令是用于指定默認(rèn)的容器主進(jìn)程的啟動(dòng)命令的苗胀,CMD 類屬于 RUN 命令基协,CMD 指令也可以用于運(yùn)行任何命令或應(yīng)用程序澜驮。

在運(yùn)行時(shí)可以指定新的命令來(lái)替代鏡像設(shè)置中的這個(gè)默認(rèn)命令杂穷,比如,ubuntu 鏡像默認(rèn)的 CMD 是 /bin/bash廊蜒,如果我們直接 docker run -it ubuntu 的話屁倔,會(huì)直接進(jìn)入 bash脑又。我們也可以在運(yùn)行時(shí)指定運(yùn)行別的命令嗅战,如 docker run -it ubuntu cat /etc/os-release。這就是用 cat /etc/os-release 命令替換了默認(rèn)的 /bin/bash 命令了色查,輸出了系統(tǒng)版本信息薯演。

在指令格式上,一般推薦使用 exec 格式秧了,這類格式在解析時(shí)會(huì)被解析為 JSON 數(shù)組跨扮,因此一定要使用雙引號(hào) ",而不要使用單引號(hào)验毡。

如果使用 shell 格式的話衡创,實(shí)際的命令會(huì)被包裝為 sh -c 的參數(shù)的形式進(jìn)行執(zhí)行。比如:

CMD echo $HOME

在實(shí)際執(zhí)行中晶通,會(huì)將其變更為:

CMD [ "sh", "-c", "echo $HOME" ]

這就是為什么我們可以使用環(huán)境變量的原因璃氢,因?yàn)檫@些環(huán)境變量會(huì)被 shell 進(jìn)行解析處理。

提到 CMD 就不得不提容器中應(yīng)用在前臺(tái)執(zhí)行和后臺(tái)執(zhí)行的問(wèn)題狮辽。這是初學(xué)者常出現(xiàn)的一個(gè)混淆拔莱。
Docker 不像虛擬機(jī),在容器中的應(yīng)用都應(yīng)該以前臺(tái)執(zhí)行隘竭,不像虛擬機(jī)那樣塘秦,用 systemd 去啟動(dòng)后臺(tái)服務(wù),容器內(nèi)沒(méi)有后臺(tái)服務(wù)餓概念动看。

如果 CMD 指令寫成:

CMD service nginx start

然后發(fā)現(xiàn)容器執(zhí)行后就立即退出了尊剔。甚至在容器內(nèi)發(fā)現(xiàn)無(wú)法執(zhí)行 systemctl 的指令。

對(duì)于容器而言菱皆,啟動(dòng)程序就是容器應(yīng)用進(jìn)程须误,容器就是為了主進(jìn)程而存在的,主進(jìn)程退出仇轻,容器就失去了存在的意義京痢。

而使用 service nginx start 命令,則是希望 upstart 來(lái)以后臺(tái)守護(hù)進(jìn)程啟動(dòng) nginx 服務(wù)篷店。
而剛才說(shuō)了 CMD service nginx start 會(huì)被理解為 CMD [ "sh", "-c", "service nginx start"]祭椰,因此主進(jìn)程實(shí)際上是 sh臭家。那么當(dāng) service nginx start 命令結(jié)束后,sh 也就結(jié)束了方淤,sh 作為主進(jìn)程退出了钉赁,自然就會(huì)令容器退出。
正確的做法是直接執(zhí)行 nginx 可執(zhí)行文件携茂,并且要求以前臺(tái)形式運(yùn)行你踩。比如:

CMD ["nginx", "-g", "daemon off;"]

該CMD 指令只能運(yùn)行一個(gè),如果存在多個(gè)讳苦,直留存一個(gè)带膜,最后一條 CMD 是生效的。

編寫Dockerfile 文件

[root@ip-10-1-0-142 mynginx]# cat Dockerfile
FROM nginx:latest
COPY hello.txt home/
COPY html/index.html /usr/share/nginx/
CMD ["nginx","-g","daemon off;"]

構(gòu)建鏡像的步驟

[root@ip-10-1-0-142 mynginx]# docker build -f Dockerfile -t nginx:v2 app
Sending build context to Docker daemon 3.631kB
Step 1/4 : FROM nginx:latest
---> 08b152afcfae
Step 2/4 : COPY hello.txt home/
---> f471772839c9
Step 3/4 : COPY html/index.html /usr/share/nginx/
---> c6c9239fc8a9
Step 4/4 : CMD ["nginx","-g","daemon off;"]
---> Running in ef82c58b610d
Removing intermediate container ef82c58b610d
---> 808dddfc65d6
Successfully built 808dddfc65d6
Successfully tagged nginx:v2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸳谜,一起剝皮案震驚了整個(gè)濱河市膝藕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卿堂,老刑警劉巖束莫,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異草描,居然都是意外死亡览绿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門穗慕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饿敲,“玉大人,你說(shuō)我怎么就攤上這事逛绵』掣鳎” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵术浪,是天一觀的道長(zhǎng)瓢对。 經(jīng)常有香客問(wèn)我,道長(zhǎng)胰苏,這世上最難降的妖魔是什么硕蛹? 我笑而不...
    開(kāi)封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮硕并,結(jié)果婚禮上法焰,老公的妹妹穿的比我還像新娘。我一直安慰自己倔毙,他們只是感情好埃仪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著陕赃,像睡著了一般卵蛉。 火紅的嫁衣襯著肌膚如雪颁股。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天毙玻,我揣著相機(jī)與錄音豌蟋,去河邊找鬼廊散。 笑死桑滩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的允睹。 我是一名探鬼主播运准,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缭受!你這毒婦竟也來(lái)了胁澳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤米者,失蹤者是張志新(化名)和其女友劉穎韭畸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蔓搞,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胰丁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喂分。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锦庸。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒲祈,靈堂內(nèi)的尸體忽然破棺而出甘萧,到底是詐尸還是另有隱情,我是刑警寧澤梆掸,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布扬卷,位于F島的核電站,受9級(jí)特大地震影響酸钦,放射性物質(zhì)發(fā)生泄漏怪得。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一钝鸽、第九天 我趴在偏房一處隱蔽的房頂上張望汇恤。 院中可真熱鬧,春花似錦拔恰、人聲如沸因谎。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)财岔。三九已至风皿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匠璧,已是汗流浹背桐款。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夷恍,地道東北人魔眨。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酿雪,于是被迫代替她去往敵國(guó)和親遏暴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • docker使用Dockerfile來(lái)定制鏡像指黎,那么Dockerfile文件如何編寫朋凉?以下就是一個(gè)簡(jiǎn)單的Docke...
    煙雨亂平生閱讀 564評(píng)論 0 0
  • 學(xué)習(xí)完整課程請(qǐng)移步 互聯(lián)網(wǎng) Java 全棧工程師 我們已經(jīng)介紹了 FROM,RUN醋安,還提及了 COPY, ADD杂彭,...
    擼帝閱讀 585評(píng)論 0 6
  • 一、Docker創(chuàng)建鏡像的方式有兩種: 一種通過(guò)commit的方式:把做了一系列操作的容器關(guān)閉吓揪,然后利用docke...
    jie0112閱讀 3,825評(píng)論 0 3
  • 1. 摘要 上文已經(jīng)介紹了 FROM亲怠,RUN,還提及了 COPY, ADD磺芭,其實(shí) Dockerfile 功能很強(qiáng)大...
    筆名輝哥閱讀 290評(píng)論 0 1
  • Dockerfile 指令 概述 我們已經(jīng)介紹了 FROM赁炎,RUN,還提及了 COPY, ADD钾腺,其實(shí) Docke...
    忞觸動(dòng)心靈閱讀 183評(píng)論 0 0