Docker初體驗(yàn)屋谭,關(guān)于Dockerfile那點(diǎn)事

一脚囊、Dockerfile的格式

Dockerfile的格式如下:

# Comment

以“#”開(kāi)頭的行為注釋行⊥┐牛跨行注釋也必須加“#”悔耘,Dockerfile不支持連續(xù)字符“\”。命令解析指令也是以“#”開(kāi)頭我擂,命令解析器是一個(gè)可選項(xiàng)衬以,位于Dockerfile的首行,只允許出現(xiàn)一次校摩,第二次出現(xiàn)則被認(rèn)為是注釋看峻,在解析器中換行符同樣是不被支持的,但是其中的非斷行空格是允許的衙吩。

#directive=value
# directive =value
#   directive= value
# directive = value 

# escap

Escape在dockerfile中被用作轉(zhuǎn)義字符和換行符互妓,如果不特別指定,系統(tǒng)默認(rèn)的轉(zhuǎn)義字符為:\ (反斜杠)。轉(zhuǎn)義不能在RUN命令中執(zhí)行冯勉,除非位于行末進(jìn)行格式換行澈蚌。作為換行符時(shí),escape允許Dockerfile指令跨行執(zhí)行灼狰。反引號(hào)在Windows下非常有用(舉例可以參閱官方文檔

# escape=\ (反斜杠)
或
# escape=` (反引號(hào))

INSTRUCTION arguments

INSTRUCTION一般被稱為指令或者命令惜浅,對(duì)大小寫(xiě)不敏感,為了與其他參數(shù)區(qū)別開(kāi)伏嗜,習(xí)慣大寫(xiě)坛悉。

.dockerfileignore file

使用Dockerfile構(gòu)建鏡像時(shí)最好是將Dockerfile放置在一個(gè)新建的空目錄下。然后將構(gòu)建鏡像所需要的文件添加到該目錄中承绸。為了提高構(gòu)建鏡像的效率裸影,你可以在目錄下新建一個(gè).dockerignore文件來(lái)指定要忽略的文件和目錄。.dockerignore文件的排除模式語(yǔ)法和 Git的.gitignore文件相似军熏。

二轩猩、相關(guān)指令詳解

FROM

每個(gè)Dockerfile必須以FROM指令開(kāi)頭,F(xiàn)ROM指明了當(dāng)前鏡像創(chuàng)建的基鏡像荡澎,也就是說(shuō)每個(gè)鏡像必須基于一個(gè)已存在的鏡像進(jìn)行創(chuàng)建均践。FROM指令后直接跟基鏡像的名稱或者鏡像名稱加標(biāo)簽。鏡像的名稱和標(biāo)簽可以去Docker Hub或者使用命令docker search keyword 進(jìn)行搜索摩幔。用法如下:

FROM <image>

FROM <image>[:<tag>] 

ARG

ARG指令定義了用戶可以在創(chuàng)建鏡像時(shí)或者運(yùn)行時(shí)傳遞的變量彤委,申明于調(diào)用類似于shell中的變量申明與定義。

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

ENV

ENV指令用來(lái)定義鏡像的環(huán)境變量或衡,并且可以引用已經(jīng)存在的環(huán)境變量焦影,例如:HOME、HOSTNAME封断、PATH斯辰。ENV的值跟ARG指令申明的變量一樣可以傳遞、被引用坡疼,定義方法也基本一致彬呻。

FROM busybox
ENV foo /bar

# WORKDIR /bar
WORKDIR ${foo}

Dockerfile中的ENV支持以下變量的訪問(wèn):ADD、COPY柄瑰、ENV闸氮、EXPOSE、FROM狱意、LABEL湖苞、STOPSIGNAL、USER详囤、VOLUME财骨、WORKDIR镐作。

RUN

RUN指令在當(dāng)前鏡像的頂層中執(zhí)行命令并提交結(jié)果,新產(chǎn)生的鏡像用于下一步的Dockerfile隆箩。分層執(zhí)行指令和生成提交符號(hào)Docker的核心概念该贾,提交很方便,容器可以從鏡像歷史中的任意點(diǎn)創(chuàng)建捌臊,類似于源碼控制杨蛋。在shell形式中,可以使用\(反斜杠)將單個(gè)RUN指令繼續(xù)到下一行理澎。RUN指令有兩種使用格式:

RUN <command>(shell形式逞力,該命令在shell中運(yùn)行,默認(rèn)情況下/bin/sh -c在Linux中運(yùn)行糠爬,cmd /S /CWindows中運(yùn)行)
RUN ["executable", "param1", "param2"](exec執(zhí)行形式)
[root@ChatDevOps ~]# cat Dockerfile 
FROM centos
RUN mkdir /chatdevops
RUN ["touch","/chatdevops/chatdevops.log"]
RUN /bin/bash 
[root@ChatDevOps ~]# docker run -it --name chatdevops chatdevops /bin/bash
[root@99484f802e71 /]# ll /chatdevops/chatdevops.log 
-rw-r--r--. 1 root root 0 May 29 03:00 /chatdevops/chatdevops.log

CMD

CMD的主要是為一個(gè)正運(yùn)行的容器提供默認(rèn)執(zhí)行命令寇荧。如果存在多個(gè)CMD指令,那么只有最后一個(gè)會(huì)被執(zhí)行执隧。如果在容器運(yùn)行時(shí)指定了命令揩抡,則CMD指定的默認(rèn)內(nèi)容會(huì)被替代。CMD一共有三種格式:

CMD ["executable","param1","param2"]  #(執(zhí)行形式镀琉,這是比較常見(jiàn)的一種形式)
CMD ["param1","param2"] #(以json數(shù)組的形式將兩個(gè)參數(shù)存儲(chǔ)下來(lái)峦嗤,在指定了ENTRYPOINT        指令后,用CMD指定具體的參數(shù)屋摔,此處必須用雙引號(hào)將涉及到的變量引起來(lái))
CMD command param1 param2 #(shell形式)
[root@ChatDevOps ~]# cat Dockerfile 
FROM centos
CMD echo "chatdevops"
CMD ["echo","Hello world"]
[root@ChatDevOps ~]# docker run -it --rm --name chatdevops chatdevops
Hello world

ENTRYPOINT

ENTRYPOINT的格式和RUN指令格式一樣烁设,分為exec格式和shell格式。ENTRYPOINT的目的和CMD一樣凡壤,都是在指定容器啟動(dòng)程序及參數(shù)署尤。ENTRYPOINT在運(yùn)行時(shí) 也可以替代耙替,不過(guò)比CMD要略顯繁瑣亚侠,需要通過(guò)docker run的參數(shù)--entrypoint來(lái)指定。
當(dāng)指定了ENTRYPOINT后俗扇,CMD的含義就發(fā)生了改變硝烂,不再是直接的運(yùn)行其命令,而是將CMD的內(nèi)容作為參數(shù)傳給ENTRYPOINT指令铜幽。

[root@ChatDevOps ~]# cat Dockerfile 
FROM ubuntu:18.04
RUN apt-get update \
 && apt-get install -y curl \
 && rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl","-s","http://ip.cn" ]
[root@ChatDevOps ~]# docker run e317e4042076
當(dāng)前 IP:71.184.25.21 來(lái)自:北京市 
[root@ChatDevOps ~]# docker run e317e4042076 -i
HTTP/1.1 200 OK
Date: Tue, 29 May 2018 09:00:10 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d4439884e43e37c36aac129e9f4d0507f1527584410; expires=Wed, 29-May-19 09:00:10 GMT; path=/; domain=.ip.cn; HttpOnly
Server: cloudflare
CF-RAY: 4227c4e460886d9c-SJC

LABEL

LABEL指令用于添加一個(gè)元數(shù)據(jù)到鏡像滞谢,鍵和值配對(duì)存在。例如可以給容器添加輔助說(shuō)明信息除抛。值中支持換行字符斜杠(\)狮杨。如果Docker中出現(xiàn)重復(fù)的鍵,則新的值會(huì)覆蓋原來(lái)的值到忽。為了減少Docker的層數(shù)橄教,可以在單一LABEL指令中指定多個(gè)標(biāo)簽:

LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

MAINTAINER

MAINTAINER在新版本中已經(jīng)廢棄清寇,可以使用LABEL來(lái)替代MAINTAINER進(jìn)行聲明。

EXPOSE

EXPOSE指定容器在運(yùn)行中監(jiān)聽(tīng)的端口护蝶。默認(rèn)情況下华烟,EXPOSE指定的是TCP端口,若要指定監(jiān)聽(tīng)udp端口:

EXPOSE 80/udp

COPY

COPY能夠從構(gòu)建上下文中復(fù)制文件到新的一層中鏡像中持灰,COPY指令有兩種形式:

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

chown屬性只支持Linux容器的構(gòu)建盔夜。COPY命令支持通配符,可以把多個(gè)源文件復(fù)制到目標(biāo)文件下堤魁。

ADD

ADD的格式和用法基本與COPY一致喂链,并在COPY的基礎(chǔ)上新增了一些功能。ADD的源文件可以是一個(gè)URL妥泉。如果本地源路徑的文件為一個(gè)tar壓縮文件的話衩藤,壓縮格式為gzip,bzip2以及xz的情況 下,ADD指令將會(huì)自動(dòng)解壓縮這個(gè)壓縮文件到目標(biāo)路徑涛漂,來(lái)自于URL的遠(yuǎn)程文件則不會(huì)被解壓赏表。

VOLUME

VOLUME旨在創(chuàng)建一個(gè)具有名稱的掛載點(diǎn)。容器在運(yùn)行時(shí)盡量保持存儲(chǔ)層不發(fā)生數(shù)據(jù)寫(xiě)入操作匈仗。一個(gè)卷可以存在于一個(gè)或多個(gè)容器的特定目錄瓢剿,這個(gè)目錄可以繞過(guò)聯(lián)合文件系統(tǒng),并提供數(shù)據(jù)共享或數(shù)據(jù)持久化功能悠轩。卷可以在容器間共享或重用间狂,對(duì)卷的修改是及時(shí)生效的。對(duì)卷的修改不會(huì)對(duì)新的鏡像產(chǎn)生影響火架,卷會(huì)一直存在直到?jīng)]有容器使用它鉴象。可以使用數(shù)組的形式指定多個(gè)卷何鸡。使用方式如下:

VOLUME /data
VOLUME ["/data"]
VOLUME ["data","test","chatdevops"]

VOLUME也可以在創(chuàng)建容器時(shí)進(jìn)行聲明:

[root@ChatDevOps docker]# docker run -it -v /myvolume --name myvolume  chatdevops

以上命令創(chuàng)建一個(gè)名為myvolume的容器纺弊,同時(shí)掛載/myvolume。/myvolume在之前并不存在骡男,在創(chuàng)建myvolume時(shí)同時(shí)創(chuàng)建了該目錄淆游。

USER

USER指令為Dockerfile中全部RUN,CMD隔盛,ENTRYPOINT設(shè)置運(yùn)行Image時(shí)使用的用戶名或UID犹菱。這個(gè)用戶或組必須事先在系統(tǒng)中存在。若不存在則下一層鏡像以root用戶進(jìn)行執(zhí)行吮炕。

USER <user>[:<group>]
USER <UID>[:<GID>]

WORKDIR

WORKDIR用來(lái)為Dockerfile下文中的RUN, CMD, ENTRYPOINT, COPY和ADD等指令指定當(dāng)前工作目錄腊脱。如果存在多個(gè)WORKDIR則以指令錢(qián)最近的一條為參考。如果該目錄不存在龙亲,則系統(tǒng)會(huì)自動(dòng)創(chuàng)建該目錄陕凹。如果要改變當(dāng)前的工作目錄震鹉,不能使用cd命令來(lái)切換,需要使用WORKDIR來(lái)進(jìn)行切換捆姜。

ONBUILD

這是一個(gè)特殊的指令传趾,它后面跟的是其它指令,比如 RUN , COPY等泥技,而這些指令浆兰,
在當(dāng)前鏡像構(gòu)建時(shí)并不會(huì)被執(zhí)行。只有當(dāng)以當(dāng)前鏡像為基礎(chǔ)鏡像珊豹,去構(gòu)建下一級(jí)鏡像的時(shí)候才會(huì)被執(zhí)行簸呈。

STOPSIGNAL

STOPSIGNAL指令設(shè)置喚醒信號(hào)并將其發(fā)送到容器后退出。后跟信號(hào)值(無(wú)符號(hào)整數(shù))或者SIGNAME格式的信號(hào)名稱店茶,例如SIGKILL蜕便。

STOPSIGNAL signal

HEALTHCHECK

Docker提供了HEALTHCHECK指令,通過(guò)該指令指定一行命令贩幻,用這行命令來(lái)判斷容器主進(jìn)程的服務(wù)狀態(tài)是否還正常轿腺,從而比較真實(shí)的反應(yīng)容器實(shí)際狀態(tài)。當(dāng)在一個(gè)鏡像指定了HEALTHCHECK指令后丛楚,用其啟動(dòng)容器族壳,初始狀態(tài)會(huì)為 starting ,在HEALTHCHECK指令檢查成功后變?yōu)閔ealthy趣些,如果連續(xù)一定次數(shù)失敗仿荆,則會(huì)變?yōu)?br> unhealthy。格式如下:

    HEALTHCHECK [OPTIONS] CMD command (check container health by running a command inside the container)
    HEALTHCHECK NONE (disable any healthcheck inherited from the base image)

HEALTHCHECK 支持下列選項(xiàng):

  • --interval=<間隔> :兩次健康檢查的間隔坏平,默認(rèn)為 30 秒拢操;
  • --timeout=<時(shí)長(zhǎng)> :健康檢查命令運(yùn)行超時(shí)時(shí)間,如果超過(guò)這個(gè)時(shí)間舶替,本次健康檢查就被視為失敗令境,默認(rèn) 30 秒;
  • --retries=<次數(shù)> :當(dāng)連續(xù)失敗指定次數(shù)后坎穿,則將容器狀態(tài)視為 unhealthy 展父,默認(rèn)3次。

HEALTHCHECK在Dockerfile中只能出現(xiàn)一次玲昧,如果出現(xiàn)多次則最后一個(gè)生效。

SHELL

SHEELL指令允許默認(rèn)的shell形式被命令形式覆蓋篮绿。在Linux系統(tǒng)中默認(rèn)shell形式為 [“/bin/sh”, “-c”], 在 Windows上是[“cmd”, “/S”, “/C”]孵延。SHELL指令必須用Dockerfile中的JSON格式寫(xiě)入。SHELL指令在Windows上特別有用亲配,其中有兩個(gè)常用的和完全不同的本機(jī)shell:cmd和powershell尘应,以及包括sh的備用shell惶凝。 SHELL指令可以出現(xiàn)多次。每個(gè)SHELL指令都會(huì)覆蓋所有以前的SHELL指令犬钢,并影響所有后續(xù)指令苍鲜。

三、參考文獻(xiàn)

https://docs.docker.com/engine/reference/builder/#usage

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玷犹,一起剝皮案震驚了整個(gè)濱河市混滔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歹颓,老刑警劉巖坯屿,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異巍扛,居然都是意外死亡领跛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)撤奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吠昭,“玉大人,你說(shuō)我怎么就攤上這事胧瓜≡踅耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵贷痪,是天一觀的道長(zhǎng)幻妓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)劫拢,這世上最難降的妖魔是什么肉津? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮舱沧,結(jié)果婚禮上妹沙,老公的妹妹穿的比我還像新娘。我一直安慰自己熟吏,他們只是感情好距糖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著牵寺,像睡著了一般悍引。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帽氓,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天趣斤,我揣著相機(jī)與錄音,去河邊找鬼黎休。 笑死浓领,一個(gè)胖子當(dāng)著我的面吹牛玉凯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播联贩,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼漫仆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泪幌?” 一聲冷哼從身側(cè)響起盲厌,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎座菠,沒(méi)想到半個(gè)月后狸眼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浴滴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年拓萌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片升略。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡微王,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出品嚣,到底是詐尸還是另有隱情炕倘,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布翰撑,位于F島的核電站罩旋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏眶诈。R本人自食惡果不足惜涨醋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逝撬。 院中可真熱鬧浴骂,春花似錦、人聲如沸宪潮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狡相。三九已至梯轻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谣光,已是汗流浹背檩淋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萄金,地道東北人蟀悦。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氧敢,于是被迫代替她去往敵國(guó)和親日戈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一孙乖、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,473評(píng)論 0 120
  • 一浙炼、Docker創(chuàng)建鏡像的方式有兩種: 一種通過(guò)commit的方式:把做了一系列操作的容器關(guān)閉,然后利用docke...
    jie0112閱讀 3,821評(píng)論 0 3
  • 昨天下午唯袄,天氣還是很熱弯屈,很悶,太陽(yáng)這位最長(zhǎng)壽的老公公恋拷,依然很是精神抖擻地普照著我們這個(gè)南方小城资厉。還好,立秋已過(guò)蔬顾,處...
    綠江南閱讀 328評(píng)論 0 0
  • 八 收養(yǎng)成功 本來(lái)宴偿,就連這衣服也不想要的。畢竟別人穿過(guò)诀豁,她還是有點(diǎn)潔癖的窄刘。但是她卻必須接了,舷胜,畢竟是她名正言順的...
    叔夜君閱讀 229評(píng)論 0 1
  • 文:二七 不說(shuō)的理想娩践,才像理想。 ——題記 1 大學(xué)時(shí)期烹骨,看過(guò)一段TED演講視...
    克里KELI閱讀 327評(píng)論 1 3