docker的Dokcerfile基礎(chǔ)命令

Dokcerfile介紹

????Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本烤宙,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個新的鏡像引颈。它們簡化了從頭到尾的流程并極大的簡化了部署工作。Dockerfile從FROM命令開始雄右,緊接著跟隨者各種方法剃诅,命令和參數(shù)巷送。其產(chǎn)出為一個新的可以用于創(chuàng)建容器的鏡像。

以下就是一些基礎(chǔ)常用的命令語句

FROM

????功能為指定基礎(chǔ)鏡像矛辕,

????并且必須是第一條指令,如果不以任何鏡像為基礎(chǔ)笑跛,那么寫法為:FROM scratch,

????同時意味著接下來所寫的指令將作為鏡像的第一層開始

????語法:

????FROM <image>

????FROM <image>:<tag>

????FROM <image>:<digest>

????三種寫法,其中<tag>和<digest> 是可選項聊品,如果沒有選擇飞蹂,那么默認(rèn)值為latest

RUN

????功能為運行指定的命令

????RUN命令有兩種格式

????RUN <command>

????RUN ["executable", "param1", "param2"]

????第一種后邊直接跟shell命令

????在linux操作系統(tǒng)上默認(rèn) /bin/sh -c

????在windows操作系統(tǒng)上默認(rèn) cmd /S /C

????第二種是類似于函數(shù)調(diào)用。

????可將executable理解成為可執(zhí)行文件翻屈,后面就是兩個參數(shù)陈哑。


????兩種寫法比對:

????????RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME

????????RUN ["/bin/bash", "-c", "echo hello"]

????????注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層.

?????????多少個RUN就構(gòu)建了多少層鏡像伸眶,會造成鏡像的臃腫惊窖、多層,不僅僅增加了構(gòu)件部署的時間厘贼,還容易出錯界酒。

????????RUN書寫時的換行符是\

CMD

????功能為容器啟動時要運行的命令

????語法有三種寫法

????????1. CMD ["executable","param1","param2"]

????????2. CMD ["param1","param2"]

????????3. CMD command param1 param2

????第三種比較好理解了,就時shell這種執(zhí)行方式和寫法

????第一種和第二種其實都是可執(zhí)行文件加上參數(shù)的形式


????舉例說明兩種寫法:

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

????CMD [ "echo", "$HOME" ]

????補充細節(jié):這里邊包括參數(shù)的一定要用雙引號涂臣,就是",不能是單引號盾计。千萬不能寫成單引號。

????原因是參數(shù)傳遞后赁遗,docker解析的是一個JSON array

????RUN & CMD

????不要把RUN和CMD搞混了署辉。

????RUN是構(gòu)件容器時就運行的命令以及提交運行結(jié)果

????CMD是容器啟動時執(zhí)行的命令,在構(gòu)件時并不運行岩四,構(gòu)件時緊緊指定了這個命令到底是個什么樣子


LABEL

????功能是為鏡像指定標(biāo)簽

????語法:

????LABEL <key>=<value> <key>=<value> <key>=<value> ...

?????一個Dockerfile種可以有多個LABEL哭尝,如下:

????LABEL "com.example.vendor"="ACME Incorporated"

????LABEL com.example.label-with-value="foo"

????LABEL version="1.0"

????LABEL description="This text illustrates \

????that label-values can span multiple lines."

?????但是并不建議這樣寫,最好就寫成一行剖煌,如太長需要換行的話則使用\符號

????如下:

????????LABEL multi.label1="value1" \

????????multi.label2="value2" \

????????other="value3"


????說明:LABEL會繼承基礎(chǔ)鏡像種的LABEL材鹦,如遇到key相同逝淹,則值覆蓋


MAINTAINER

????指定作者

????語法:

????MAINTAINER <name>

EXPOSE

????功能為暴漏容器運行時的監(jiān)聽端口給外部

????但是EXPOSE并不會使容器訪問主機的端口

????如果想使得容器與主機的端口有映射關(guān)系,必須在容器啟動的時候加上 -P?參數(shù)

ENV

????功能為設(shè)置環(huán)境變量

????語法有兩種

? ??1. ENV <key> <value>

? ??2. ENV <key>=<value> ...

????兩者的區(qū)別就是第一種是一次設(shè)置一個桶唐,第二種是一次設(shè)置多個


ADD

?????一個復(fù)制命令栅葡,把文件復(fù)制到景象中。

????如果把虛擬機與容器想象成兩臺linux服務(wù)器的話尤泽,那么這個命令就類似于scp欣簇,只是scp需要加用戶名和密碼的權(quán)限驗證,而ADD不用坯约。


????語法如下:

? ??1. ADD <src>... <dest>

? ??2. ADD ["<src>",... "<dest>"]

????<dest>路徑的填寫可以是容器內(nèi)的絕對路徑熊咽,也可以是相對于工作目錄的相對路徑

????<src>可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url

????如果把<src>寫成一個url闹丐,那么ADD就類似于wget命令

????盡量不要把<scr>寫成一個文件夾横殴,如果<src>是一個文件夾了,復(fù)制整個目錄的內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)


COPY

????看這個名字就知道卿拴,又是一個復(fù)制命令

????語法如下:

? ??1. COPY <src>... <dest>

? ??2. COPY ["<src>",... "<dest>"]

????與ADD的區(qū)別

????COPY的<src>只能是本地文件衫仑,其他用法一致


ENTRYPOINT

????功能是啟動時的默認(rèn)命令

????語法如下:

? ??1. ENTRYPOINT ["executable", "param1", "param2"]

? ??2. ENTRYPOINT command param1 param2

????如果從上到下看到這里的話,那么你應(yīng)該對這兩種語法很熟悉啦堕花。

????第二種就是寫shell

????第一種就是可執(zhí)行文件加參數(shù)

????與CMD比較說明(這倆命令太像了惑畴,而且還可以配合使用):

????????1. 相同點:

????????????只能寫一條,如果寫了多條航徙,那么只有最后一條生效

????????????容器啟動時才運行,運行時機相同

????????2. 不同點:

?????????????ENTRYPOINT不會被運行的command覆蓋陷虎,而CMD則會被覆蓋

?????????????如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD到踏,并且CMD指令不是一個完整的可執(zhí)行命令,

????????????????那么CMD指定的內(nèi)容將會作為ENTRYPOINT的參數(shù)

????????Docker中CMD與ENTRYPOINT的簡明理解


VOLUME

????可實現(xiàn)掛載功能尚猿,可以將內(nèi)地文件夾或者其他容器種得文件夾掛在到這個容器種

????語法為:

? ??VOLUME ["/data"]


????說明:

????? ?["/data"]可以是一個JsonArray 窝稿,也可以是多個值。所以如下幾種寫法都是正確的

? ??VOLUME ["/var/log/"]

? ??VOLUME /var/log

? ??VOLUME /var/log /var/db

????一般的使用場景為需要持久化存儲數(shù)據(jù)時

????容器使用的是AUFS凿掂,這種文件系統(tǒng)不能持久化數(shù)據(jù)伴榔,當(dāng)容器關(guān)閉后,所有的更改都會丟失庄萎。

????所以當(dāng)數(shù)據(jù)需要持久化時用這個命令踪少。


USER

????設(shè)置啟動容器的用戶,可以是用戶名或UID糠涛,所以援奢,只有下面的兩種寫法是正確的

? ??USER daemo

? ??USER UID

????注意:如果設(shè)置了容器以daemon用戶去運行,那么RUN, CMD 和 ENTRYPOINT 都會以這個用戶去運行


ARG

????語法:

? ??ARG <name>[=<default value>]

????設(shè)置變量命令忍捡,ARG命令定義了一個變量集漾,在docker build創(chuàng)建鏡像的時候切黔,

????使用 --build-arg <varname>=<value>來指定參數(shù)

????如果用戶在build鏡像時指定了一個參數(shù)沒有定義在Dockerfile種,那么將有一個Warning

????????提示如下:

? ??[Warning] One or more build-args [foo] were not consumed.


????我們可以定義一個或多個參數(shù)具篇,如下:

? ??FROM busybox

? ??ARG user1

? ??ARG buildno

? ??...

????也可以給參數(shù)一個默認(rèn)值:

? ??FROM busybox

? ??ARG user1=someuser

? ??ARG buildno=1

? ??...

????如果我們給了ARG定義的參數(shù)默認(rèn)值纬霞,那么當(dāng)build鏡像時沒有指定參數(shù)值,將會使用這個默認(rèn)值


ONBUILD

????語法:

? ??ONBUILD [INSTRUCTION]

????這個命令只對當(dāng)前鏡像的子鏡像生效驱显。

????比如當(dāng)前鏡像為A诗芜,在Dockerfile種添加:

? ??ONBUILD RUN ls -al

????這個 ls -al 命令不會在A鏡像構(gòu)建或啟動的時候執(zhí)行

? ? 此時有一個鏡像B是基于A鏡像構(gòu)建的,那么這個ls -al 命令會在B鏡像構(gòu)建的時候被執(zhí)行秒紧。


STOPSIGNAL

????語法:

? ??STOPSIGNAL signal

????STOPSIGNAL命令是的作用是當(dāng)容器推出時給系統(tǒng)發(fā)送什么樣的指令

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绢陌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熔恢,更是在濱河造成了極大的恐慌脐湾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叙淌,死亡現(xiàn)場離奇詭異秤掌,居然都是意外死亡,警方通過查閱死者的電腦和手機鹰霍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門闻鉴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茂洒,你說我怎么就攤上這事孟岛。” “怎么了督勺?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵渠羞,是天一觀的道長。 經(jīng)常有香客問我智哀,道長次询,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任瓷叫,我火速辦了婚禮屯吊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摹菠。我一直安慰自己盒卸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布次氨。 她就那樣靜靜地躺著世落,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屉佳,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天谷朝,我揣著相機與錄音,去河邊找鬼武花。 笑死圆凰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的体箕。 我是一名探鬼主播专钉,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼累铅!你這毒婦竟也來了跃须?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娃兽,失蹤者是張志新(化名)和其女友劉穎菇民,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體投储,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡第练,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了玛荞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娇掏。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勋眯,靈堂內(nèi)的尸體忽然破棺而出婴梧,到底是詐尸還是另有隱情,我是刑警寧澤客蹋,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布志秃,位于F島的核電站,受9級特大地震影響嚼酝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竟坛,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一闽巩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧担汤,春花似錦涎跨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至率碾,卻和暖如春叔营,著一層夾襖步出監(jiān)牢的瞬間屋彪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工绒尊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畜挥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓婴谱,卻偏偏與公主長得像蟹但,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谭羔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 在前面兩節(jié)我們學(xué)習(xí)了如何安裝以及簡單的運行管理docker容器华糖,在本節(jié)我們將會更多的探討關(guān)于docker鏡像的知識...
    井底蛙蛙呱呱呱閱讀 4,099評論 0 5
  • 一、Docker創(chuàng)建鏡像的方式有兩種: 一種通過commit的方式:把做了一系列操作的容器關(guān)閉瘟裸,然后利用docke...
    jie0112閱讀 3,834評論 0 3
  • 突然間心情極壞客叉。沒能控制住自己。這是怎么了景描?一個小小的不如意讓我如此失控十办!壓抑太久了? 悲觀的人超棺,心中沒有希望向族。即...
    元雷電風(fēng)云閱讀 127評論 0 1
  • 培養(yǎng)孩子同情心參照如下幾點: 1.溫柔地對孩子說話 父母是孩子最好的老師氧苍。父母說話時的語調(diào)夜矗、口氣將直接影響孩子的語...
    擁抱未來MrZ閱讀 425評論 0 0