Docker之Dockerfile語法詳解

Dockfile是一種被Docker程序解釋的腳本,Dockerfile由一條一條的指令組成纳猪,每條指令對應(yīng)Linux下面的一條命令。Docker程序?qū)⑦@些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支持的命令倔毙,Docker程序解決這些命令間的依賴關(guān)系,類似于Makefile乙濒。Docker程序?qū)⒆x取Dockerfile陕赃,根據(jù)指令生成定制的image。相比image這種黑盒子颁股,Dockerfile這種顯而易見的腳本更容易被使用者接受么库,它明確的表明image是怎么產(chǎn)生的。有了Dockerfile甘有,當(dāng)我們需要定制自己額外的需求時诉儒,只需在Dockerfile上添加或者修改指令,重新生成image即可亏掀,省去了敲命令的麻煩忱反。

在 Dockerfile 中用到的命令有
FROM
FROM指定一個基礎(chǔ)鏡像, 一般情況下一個可用的 Dockerfile一定是 FROM 為第一個指令滤愕。至于image則可以是任何合理存在的image鏡像温算。
FROM 一定是首個非注釋指令 Dockerfile.
FROM 可以在一個 Dockerfile 中出現(xiàn)多次,以便于創(chuàng)建混合的images该互。
如果沒有指定 tag 米者,latest 將會被指定為要使用的基礎(chǔ)鏡像版本。

MAINTAINER
這里是用于指定鏡像制作者的信息

RUN
RUN命令將在當(dāng)前image中執(zhí)行任意合法命令并提交執(zhí)行結(jié)果宇智。命令執(zhí)行提交后蔓搞,就會自動執(zhí)行Dockerfile中的下一個指令。
層級 RUN 指令和生成提交是符合Docker核心理念的做法随橘。它允許像版本控制那樣喂分,在任意一個點(diǎn),對image 鏡像進(jìn)行定制化構(gòu)建机蔗。
RUN 指令緩存不會在下個命令執(zhí)行時自動失效蒲祈。比如 RUN apt-get dist-upgrade -y 的緩存就可能被用于下一個指令. --no-cache 標(biāo)志可以被用于強(qiáng)制取消緩存使用甘萧。

ENV
ENV指令可以用于為docker容器設(shè)置環(huán)境變量
ENV設(shè)置的環(huán)境變量,可以使用 docker inspect命令來查看梆掸。同時還可以使用docker run --env <key>=<value>來修改環(huán)境變量扬卷。

USER
USER 用來切換運(yùn)行屬主身份的。Docker 默認(rèn)是使用 root酸钦,但若不需要炒辉,建議切換使用者身分度液,畢竟 root 權(quán)限太大了玛臂,使用上有安全的風(fēng)險尔店。

WORKDIR
WORKDIR 用來切換工作目錄的。Docker 默認(rèn)的工作目錄是/欢伏,只有 RUN 能執(zhí)行 cd 命令切換目錄入挣,而且還只作用在當(dāng)下下的 RUN,也就是說每一個 RUN 都是獨(dú)立進(jìn)行的硝拧。如果想讓其他指令在指定的目錄下執(zhí)行径筏,就得靠 WORKDIR。WORKDIR 動作的目錄改變是持久的河爹,不用每個指令前都使用一次 WORKDIR匠璧。

COPY
COPY 將文件從路徑 <src> 復(fù)制添加到容器內(nèi)部路徑 <dest>。
<src>
必須是想對于源文件夾的一個文件或目錄咸这,也可以是一個遠(yuǎn)程的url夷恍,<dest>
是目標(biāo)容器中的絕對路徑。
所有的新文件和文件夾都會創(chuàng)建UID 和 GID 媳维。事實上如果 <src> 是一個遠(yuǎn)程文件URL酿雪,那么目標(biāo)文件的權(quán)限將會是600。

ADD
ADD 將文件從路徑 <src> 復(fù)制添加到容器內(nèi)部路徑 <dest>侄刽。
<src> 必須是想對于源文件夾的一個文件或目錄指黎,也可以是一個遠(yuǎn)程的url。<dest> 是目標(biāo)容器中的絕對路徑州丹。
所有的新文件和文件夾都會創(chuàng)建UID 和 GID醋安。事實上如果 <src> 是一個遠(yuǎn)程文件URL,那么目標(biāo)文件的權(quán)限將會是600墓毒。

VOLUME
創(chuàng)建一個可以從本地主機(jī)或其他容器掛載的掛載點(diǎn)吓揪,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等。

EXPOSE
EXPOSE 指令指定在docker允許時指定的端口進(jìn)行轉(zhuǎn)發(fā)所计。

CMD
Dockerfile.中只能有一個CMD指令柠辞。 如果你指定了多個,那么最后個CMD指令是生效的主胧。
CMD指令的主要作用是提供默認(rèn)的執(zhí)行容器叭首。這些默認(rèn)值可以包括可執(zhí)行文件习勤,也可以省略可執(zhí)行文件。
當(dāng)你使用shell或exec格式時焙格, CMD
會自動執(zhí)行這個命令图毕。

ONBUILD
ONBUILD 的作用就是讓指令延遲執(zhí)行,延遲到下一個使用 FROM 的 Dockerfile 在建立 image 時執(zhí)行眷唉,只限延遲一次吴旋。
ONBUILD 的使用情景是在建立鏡像時取得最新的源碼 (搭配 RUN) 與限定系統(tǒng)框架。

ARG
ARG是Docker1.9 版本才新加入的指令厢破。
ARG 定義的變量只在建立 image 時有效,建立完成后變量就失效消失

LABEL
定義一個 image 標(biāo)簽 Owner治拿,并賦值摩泪,其值為變量 Name 的值。(LABEL Owner=$Name )

ENTRYPOINT
是指定 Docker image 運(yùn)行成 instance (也就是 Docker container) 時劫谅,要執(zhí)行的命令或者文件见坑。

注意

  • CMD 和 ENTRYPOINT 都能用來指定開始運(yùn)行的程序,而且這兩個命令都有兩種不用的語法:
CMD ls -l

or

CMD ["ls",''-l"]

對于第一種語法捏检,docker 會自動加入“/bin/sh –c”到命令中荞驴,這樣就有可能導(dǎo)致意想不到的行為。為了避免這種行為贯城,我們推薦所有的 CMD 和 ENTRYPOINT 都應(yīng)該使用第二種語法熊楼。
如果兩個同時使用,請確定確定他們的含義沒有錯誤能犯。一般來說需要兩個同時使用的情況只有 ENTRYPOINT 指定需要運(yùn)行的 binary鲫骗,CMD 給出運(yùn)行的默認(rèn)參數(shù)。

  • 盡量合并命令
    Dockerfile 中的每一個命令都會創(chuàng)建一個新的 layer踩晶,而一個容器能夠擁有的最多 layer 數(shù)是有限制的执泰。所以盡量將邏輯上連貫的命令合并可以減少 layer的層數(shù),合并命令的方法可以包括將多個可以合并的命令(EXPOSE渡蜻, ENV术吝,VOLUME,COPY)合并茸苇。
    Dockerfile 中的每一個命令都會創(chuàng)建一個新的 layer排苍,而一個容器能夠擁有的最多 layer 數(shù)是有限制的。所以盡量將邏輯上連貫的命令合并可以減少 layer 的層數(shù)税弃,這也可以加快編譯速度纪岁。
    將多個可以合并的命令(RUN,EXPOSE, ENV,VOLUME,COPY)合并,比如:
EXOISE 80
EXOISE 8080
CMD cd /tmp
CMD ls

==>

EXOISE 80 8080
CMD cd /tmp && ls
  • ADD命令和 COPY 命令在很大層度上功能是一樣的则果。但是 COPY 語義更加直接幔翰,所以我們推薦盡量使用 COPY 命令漩氨。唯一例外的是 ADD 命令自帶解壓功能,如果需要拷貝并解壓一個文件到鏡像中遗增,那么我們可以使用 ADD 命令叫惊。除此之外,我們都推薦使用 COPY 命令做修。
ADD 1.1.1.100:1234/jdk-8u74-linux-x64.tar.gz /usr/local/
  • USER的使用
    Docker 默認(rèn)所有的應(yīng)用都會跑在容器的 root user 底下霍狰,但是這樣會造成一些潛在的安全隱患。在 production 環(huán)境跑的 Container 最好是通過USER命令跑在非特權(quán)用戶底下饰及。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔗坯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燎含,更是在濱河造成了極大的恐慌宾濒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屏箍,死亡現(xiàn)場離奇詭異绘梦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赴魁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門卸奉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颖御,你說我怎么就攤上這事榄棵。” “怎么了郎嫁?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵秉继,是天一觀的道長。 經(jīng)常有香客問我泽铛,道長尚辑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任盔腔,我火速辦了婚禮杠茬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弛随。我一直安慰自己瓢喉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布舀透。 她就那樣靜靜地躺著栓票,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上走贪,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天佛猛,我揣著相機(jī)與錄音,去河邊找鬼坠狡。 笑死继找,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逃沿。 我是一名探鬼主播婴渡,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凯亮!你這毒婦竟也來了边臼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤假消,失蹤者是張志新(化名)和其女友劉穎硼瓣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體置谦,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年亿傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了媒峡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡葵擎,死狀恐怖谅阿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酬滤,我是刑警寧澤签餐,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盯串,受9級特大地震影響氯檐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜体捏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一冠摄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧几缭,春花似錦河泳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至某抓,卻和暖如春纸兔,著一層夾襖步出監(jiān)牢的瞬間惰瓜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工食拜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸵熟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓负甸,卻偏偏與公主長得像流强,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呻待,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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