12 - Dockerfile指令詳解(Docker系列)

本文章來自【知識(shí)林】

在使用Dockerfile一構(gòu)建Docker鏡像之前需要先搞清楚Dockerfile中都有哪些常用的指令,這樣在使用起來才能得心應(yīng)手笔呀。

這篇文章主要列舉出Dockerfile中比較常用的指令及其用法和說明辕近,需要注意的是這些指令都是全部大寫介褥。

FROM

  • 說明:指定該鏡像的基礎(chǔ)鏡像
  • 格式如:FROM <image>FROM <image>:<tag>
  • 示例:FROM centos:7
  • 注意:FROM一般出現(xiàn)在文件頭吮廉,且每個(gè)鏡像都需要有一個(gè)FROM來指定基礎(chǔ)鏡像逾礁。

MAINTAINER

  • 說明:指定作者信息
  • 格式如:MAINTAINER <name>
  • 示例:MAINTAINER 知識(shí)林 "393156105@qq.com"

RUN

  • 說明:在構(gòu)建鏡像時(shí)執(zhí)行腳本
  • 格式如:RUN <command>说铃、RUN ["exec", "par1", "par2"]
  • 示例:RUN ls -l(以詳細(xì)信息方式列表當(dāng)前目錄下的文件,跟在shell終端運(yùn)行一樣)

CMD

  • 說明:在運(yùn)行容器時(shí)執(zhí)行腳本
  • 格式如:CMD <command> <par1> <par2> ...嘹履、CMD ["exec", "par1", "par2"]
  • 示例:CMD ["ls", "-l"]
  • 注意:一個(gè)Dockerfile中只有一條CMD腻扇,如果有多條只執(zhí)行最后一條;在運(yùn)行容器時(shí)如果用戶指定了運(yùn)行命令則Dockerfile中的CMD將被覆蓋砾嫉。

ENTRYPOINT

  • 說明:在運(yùn)行容器時(shí)執(zhí)行腳本
  • 格式如:ENTRYPOINT ["exec", "par1", "par2"]幼苛、ENTRYPOINT command par1 par2
  • 示例:ENTRYPOINT ["catalina.sh", "run"]
  • 注意:一個(gè)Dockerfile中只有一條ENTRYPOINT,如果有多條只執(zhí)行最后一條焰枢;不可以被容器運(yùn)行時(shí)的命令所覆蓋。

EXPOSE

  • 說明:讓Docker暴露容器的端口號(hào)舌剂,供其他容器使用济锄,在宿主機(jī)以外的網(wǎng)絡(luò)中是無法使用的
  • 格式如:EXPOSE <port> ...
  • 示例:EXPOSE 8080
  • 注意:
    • 在Docker中有兩種暴露端口的概念,一種叫EXPOSE隱式暴露霍转,只供Docker服務(wù)內(nèi)部使用荐绝;另一種叫PUBLISH顯式暴露,供外部網(wǎng)絡(luò)使用避消,PUBLISH只是一個(gè)概念在Dockerfile中沒有這個(gè)指令低滩。
    • EXPOSE 只在Dockerfile中出現(xiàn),所暴露的端口只是被其他容器使用
    • PUBLISH 沒有該指令而是通過docker run命令的參數(shù)-p岩喷、-P或在docker-compose中的ports來體現(xiàn)
    • -P:大寫是屬于自動(dòng)映射恕沫,將Dockerfile中EXPOSE所暴露的所有端口分別映射到宿主機(jī)的隨機(jī)端口,每次啟動(dòng)或重啟容器時(shí)端口都可能有所不同
    • -p:小寫是屬于固定映射纱意,格式如:-p 宿主端口:容器端口婶溯,宿主端口和容器端口可以是純數(shù)字也可以是一個(gè)范圍,如:-p 8060-8080:8060-8080,意為將宿主機(jī)的8060(含)到8080(含)的端口映射到容器的8060(含)到8080(含)端口迄委,需要注意的是在使用范圍時(shí)褐筛,宿主端口個(gè)數(shù)應(yīng)該與容器端口個(gè)數(shù)匹配;但上面這個(gè)例子可以寫成:-p 7060-7080:8060-8080叙身,這樣宿主的端口就在7060-7080范圍內(nèi)

ENV

  • 說明:指定環(huán)境變量渔扎,在Dockerfile文件中的后續(xù)代碼中使用,在容器運(yùn)行時(shí)也可以使用
  • 格式如:ENV <key> <value>
  • 示例:ENV tomcat_home /web/tomcat/

ADD

  • 說明:添加文件(夾)到容器
  • 格式如:ADD <src> <dest>
  • 示例:ADD web.jar /web.jar
  • 注意:復(fù)制指定的<src>到容器中的<dest>信轿,<src>可以是Dockerfile所在目錄的一個(gè)相對(duì)路徑晃痴,也可以是一個(gè)URL,也可以是一個(gè)tar文件(tar文件將自動(dòng)解壓成文件目錄)

COPY

  • 說明:添加文件(夾)到容器
  • 格式如:COPY <src> <dest>
  • 示例:COPY web.jar /web.jar
  • 注意:與ADD功能相似虏两,只是不能指定URL愧旦,使用本地文件(夾)為源文件時(shí)墩弯,推薦使用COPY

VOLUME

  • 說明:創(chuàng)建掛載點(diǎn)
  • 格式如:VOLUME [path]
  • 示例:VOLUME ["/datas"]
  • 注意:
    • VOLUME在原理和概念上與EXPOSE差不多摩泪,都是屬于供容器與容器間使用
    • 通過VOLUME掛載的卷可以供其他容器使用
    • 舉例說明:
      • 創(chuàng)建一個(gè)Dockerfile來構(gòu)建一個(gè)鏡像,內(nèi)容如下:

          FROM centos
          VOLUME ["/web/images", "/web/files"]
        
      • 構(gòu)建鏡像

          docker build -t "zsl131/test01" .
        
      • 啟動(dòng)容器

          docker run -d --name test-root
        
      • 可以使用命令:docker inspect test-root來查看容器詳細(xì)信息直撤,在Mounts部份可以看到兩個(gè)掛載點(diǎn):/web/images/web/files

      • 啟動(dòng)另一個(gè)容器來共用這兩個(gè)掛載卷

          docker run -it --name test-1 --volumes-from test-root centos
        

        注意:使用--volumes-from來指定掛載點(diǎn)祖凫,這時(shí)容器test-roottest-1里面都分別有掛載卷/web/images/web/files琼蚯,可以啟動(dòng)任意多個(gè)容器使用--volumes-from來共用這些掛載卷,這些容器可以來自不同的鏡像惠况。當(dāng)任何一個(gè)容器中的掛載卷中的文件發(fā)生變化時(shí)其他容器掛載卷中的內(nèi)容也隨之改變遭庶。

        容器test-root即使已經(jīng)停止也可以在啟動(dòng)其他容器時(shí)使用--volumes-from test-root來掛載這些卷,只要test-root不被刪除稠屠,不過如果test-root真被刪除還可以使用--volumes-from test-1峦睡,因?yàn)槿萜?code>test-1中還存在我們所需要的掛載卷,換句話說這些掛載卷永遠(yuǎn)存在直到所有使用這些掛載卷的容器都被刪除权埠。

      • VOLUMEdocker run參數(shù)-v是有區(qū)別的榨了。docker run -v /host/web/images:/web/images -v /host/web/files:/web/files:rw是將容器內(nèi)的/web/images掛載到宿主機(jī)的/host/web/images目錄上;將容器內(nèi)的/web/files掛載到宿主機(jī)的/host/web/files目錄上攘蔽,rw表示可讀寫龙屉。

WORKDIR

  • 說明:設(shè)置工作目錄
  • 格式如:WORKDIR /path
  • 示例:WORKDIR /web
  • 注意:可以使用絕對(duì)路徑,也可以使用相對(duì)路徑满俗,設(shè)置之后的所有操作都將在這個(gè)目錄下完成

特別注意

在上面的描述中可以看到有兩組指令在功能上都差不多转捕,但也是有區(qū)別的:

  • RUNCMD唆垃、ENTRYPOINT執(zhí)行腳本的指令

    • 三個(gè)指令都是執(zhí)行腳本
    • RUN是在創(chuàng)建鏡像是執(zhí)行五芝,即使用docker build命令時(shí)執(zhí)行,在一個(gè)Dockerfile里面可以有多個(gè)RUN
    • CMDENTRYPOINT是在運(yùn)行容器時(shí)執(zhí)行辕万,即使用docker run命令時(shí)執(zhí)行与柑,這兩個(gè)指令在Dockerfile中都只有最行一條被執(zhí)行
    • CMD在使用docker run時(shí)可以加參數(shù)將Dockerfile中的CMD覆蓋
    • ENTRYPOINT在Dockerfile中出現(xiàn)后就一定會(huì)在docker run時(shí)被執(zhí)行谤辜,不必?fù)?dān)心會(huì)被其他參數(shù)所覆蓋。
  • ADD价捧、COPY拷貝文件(夾)到容器

    • ADD拷貝文件(夾)時(shí)可以指定本地文件丑念、遠(yuǎn)程URL地址,如果拷貝的是tar文件時(shí)將會(huì)被自動(dòng)解壓成文件夾
    • COPY拷貝文件(夾)時(shí)不可以指定遠(yuǎn)程URL地址结蟋,拷貝tar文件也不會(huì)被自動(dòng)解壓成文件夾脯倚,在拷貝本地文件時(shí)建議使用COPY

本文章來自【知識(shí)林】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嵌屎,隨后出現(xiàn)的幾起案子推正,更是在濱河造成了極大的恐慌,老刑警劉巖宝惰,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植榕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尼夺,警方通過查閱死者的電腦和手機(jī)尊残,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淤堵,“玉大人寝衫,你說我怎么就攤上這事」招埃” “怎么了慰毅?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扎阶。 經(jīng)常有香客問我汹胃,道長,這世上最難降的妖魔是什么东臀? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任着饥,我火速辦了婚禮,結(jié)果婚禮上啡邑,老公的妹妹穿的比我還像新娘贱勃。我一直安慰自己井赌,他們只是感情好谤逼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仇穗,像睡著了一般流部。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纹坐,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天枝冀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死果漾,一個(gè)胖子當(dāng)著我的面吹牛球切,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绒障,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼吨凑,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了户辱?” 一聲冷哼從身側(cè)響起鸵钝,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庐镐,沒想到半個(gè)月后恩商,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡必逆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年怠堪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末患。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡研叫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璧针,到底是詐尸還是另有隱情嚷炉,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布探橱,位于F島的核電站申屹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隧膏。R本人自食惡果不足惜哗讥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胞枕。 院中可真熱鬧杆煞,春花似錦、人聲如沸腐泻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽派桩。三九已至构诚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铆惑,已是汗流浹背范嘱。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工送膳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丑蛤。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓叠聋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親受裹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晒奕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,476評(píng)論 0 120
  • 五名斟、Docker 端口映射 無論如何脑慧,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外砰盐,除了...
    R_X閱讀 1,740評(píng)論 0 7
  • 一闷袒、Docker創(chuàng)建鏡像的方式有兩種: 一種通過commit的方式:把做了一系列操作的容器關(guān)閉,然后利用docke...
    jie0112閱讀 3,825評(píng)論 0 3
  • Docker — 云時(shí)代的程序分發(fā)方式 要說最近一年云計(jì)算業(yè)界有什么大事件岩梳?Google Compute Engi...
    ahohoho閱讀 15,511評(píng)論 15 147
  • 格局太小囊骤,自己太low,永遠(yuǎn)把自己框在自己的認(rèn)知里冀值,能有什么未來呢也物? 晚上和幾個(gè)親戚一起聊天,聊到其中一位的孩子時(shí)...
    biliali閱讀 235評(píng)論 0 0