Dockerfile

Dockerfile是一個文本格式的配置文件膝昆,用戶可以使用Dockerfile快速創(chuàng)建自定義的鏡像扇售。

基本結(jié)構(gòu)

Dockerfile由一行行命令語句組成改含,并且支持以#開頭的注釋行杆烁。

一般Dockerfile文件分為四部分:基礎(chǔ)鏡像信息灭忠、維護者信息、鏡像操作指令和容器啟動時執(zhí)行指令鸿摇。

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author:docker_user
# Command format: Instruction [arguments / command] ..
# 第一行必須制定基于的基礎(chǔ)鏡像
FROM ubuntu
# 維護者信息
MAINTAINER docker_user docker_user@email.com
# 鏡像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器啟動時執(zhí)行指令
CMD /usr/sbin/nginx

Dockerfile文件編寫時石景,一開始必須指明所基于的鏡像名稱,接下來一般會說明維護者信息

后面則是鏡像操作指令拙吉,例如RUN指令潮孽,鏡像增加新的一層,并提交筷黔。最后是CMD指令往史,來指定運行容器時的操作命令。

以下有兩個摘自書上的Dockerfile例子:

# Ngnix
# 
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor Vieux <victor@docker.com>
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

此Dockerfile文件是在ubuntu父鏡像基礎(chǔ)上安裝inotify-tools佛舱、nginx椎例、apache2、openssh-server軟件请祖,從而創(chuàng)建一個新的Nginx鏡像

:inotify-tools是為linux下inotify文件監(jiān)控工具提供的一套c的開發(fā)接口庫函數(shù)订歪,同時還提供了一系列的命令行工具,這些工具可以用來監(jiān)控文件系統(tǒng)的事件肆捕。

# Firefox over VNC
# 
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to reate a 'fake' display and firefox
RUN apt-get update && apt-get install -y xllvnc xvfb firefox
RUN mkdir /.vnc
# Setup a password
RUN xllvnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["xllvnc", "-forever", "-usepw", "-create"]

此Dockerfile基于ubuntu父鏡像刷晋,安裝filefox和vnc軟件,啟動后慎陵,用戶可以通過5900端口通過vnc方式使用firefox眼虱。

指令

指令的一般格式為INSTRUCTION arguments,指令包括FROM席纽、MAINTAINER捏悬、RUN等。

Dockerfile指令說明

指令 說明
FROM 指定所創(chuàng)建鏡像的基礎(chǔ)鏡像
MAINTAINER 指定維護者信息
RUN 運行命令
CMD 指定啟動容器時默認執(zhí)行的命令
LABEL 指定生成鏡像的元數(shù)據(jù)標簽信息
EXPOSE 聲明鏡像內(nèi)服務(wù)所監(jiān)聽的端口
ENV 指定容器環(huán)境變量
ADD 復(fù)制指定的 <src> 路徑下的內(nèi)容到容器中的 <dest> 路徑下润梯,<src> 可以為URL过牙;如果為tar文件,會自動解壓到 <dest> 路徑下
COPY 復(fù)制本地主機的 <src> 路徑下的內(nèi)容到鏡像中的 <dest> 路徑下纺铭;一般情況下推薦使用COPY而不是ADD
ENTRYPOINT 指定鏡像的默認入口
VOLUME 創(chuàng)建數(shù)據(jù)卷掛載點
USER 指定運行容器時的用戶名或UID
WORKDIR 配置工作目錄
ARG 指定鏡像內(nèi)使用的參數(shù) (例如版本號信息等)
ONBUILD 配置當所創(chuàng)建的鏡像作為其他鏡像的基礎(chǔ)鏡像時抒和,所執(zhí)行的創(chuàng)建操作指令
STOPSIGNAL 容器退出的信號值
HEALTHCHECK 如何進行健康檢查
SHELL 指定使用shell時的默認shell類型

FROM

格式為 FROM <image> 或FROM<image>:<tag>

第一條指令必須為FROM指令。并且彤蔽,如果在同一個Dockerfile中創(chuàng)建多個鏡像時摧莽,可以使用多個FROM指令(每個鏡像一次)。

MAINTAINER

格式為 MAINTAINER <name>, 指定維護者信息

RUN

格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]

RUN <command> 將在shell終端中運行命令顿痪,即 /bin/sh -c

RUN ["executable", "param1", "param2"]則使用exec執(zhí)行镊辕。

指定使用其他終端可以通過第二種方式實現(xiàn)油够,例如 RUN ["/bin/bash", "-c", "echo hello"]。

每條RUN指令將在當前鏡像基礎(chǔ)上執(zhí)行指令命令征懈,并提交為新的鏡像石咬。當命令較長時可以用 \ 來換行。

CMD

支持三種格式

  • 使用exec執(zhí)行卖哎,推薦方式

    CMD ["executable", "param1", "param2"]
    
  • 在/bin/sh中執(zhí)行鬼悠,提供給需要交互的應(yīng)用

    CMD command param1 param2
    
  • 提供給ENTRYPOINT的默認參數(shù)

    CMD ["param1", "param2"]
    

指定啟動容器時執(zhí)行的命令,每個Dockerfile只能有一條CMD命令亏娜。如果指定了多條命令焕窝,只有最后一條會被執(zhí)行。

如果用戶啟動容器時指定了運行的命令维贺,則會覆蓋掉CMD指定的命令它掂。

EXPOSE

格式為 EXPOSE <port> [<port>...]

例如:EXPOSE 22 80 8443

就是告訴Docker服務(wù)器容器暴露的端口號,供互聯(lián)系統(tǒng)使用溯泣。在啟動容器時需要通過-P或者-p來指定端口映射虐秋。

ENV

格式為 ENV <key> <value>

指定一個環(huán)境變量,會被后續(xù)RUN指令使用垃沦,并在容器運行時保持客给。例如:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD

格式為 ADD <src> <dest>

該命令將復(fù)制指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄)肢簿;也可以是一個URL起愈;還可以是一個tar文件(自動解壓為目錄)。

COPY

格式為 COPY <src> <dest>

復(fù)制本地主機的<src>(為Dockerfile所在目錄的相對路徑译仗,文件或目錄)為容器中的<dest>。目標路徑不存在時官觅,會自動創(chuàng)建纵菌。

當使用本地目錄為源目錄時,推薦使用COPY

ENTRYPOINT

  • 使用exec執(zhí)行休涤,推薦方式

    ENTRYPOINT ["executable", "param1", "param2"]
    
  • 在shell中執(zhí)行

    ENTRYPOINT command param1 param2
    

配置容器啟動后執(zhí)行的命令咱圆,并且不可被docker run提供的參數(shù)覆蓋

每個Dockerfile中只能有一個ENTRYPOINT,當制定多個ENTRYPOINT時功氨,只有最后一個生效序苏。

VOLUME

格式為 VOLUME ["/data"]

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

USER

格式為 USER daemon

指定運行容器時的用戶名或UID忱详,后續(xù)的RUN也會使用指定的用戶。

當服務(wù)不需要管理員權(quán)限時跺涤,可以通過該命令指定運行用戶匈睁。并且可以在之前創(chuàng)建所需要的用戶监透,例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres

要臨時獲取管理員權(quán)限可以使用gosu,不推薦sudo

WORKDIR

格式為 WORKDIR /path/to/workdir

為后續(xù)RUN航唆、CMD胀蛮、ENTRYPOINT指令配置工作目錄。

可以使用多個WORKDIR指令糯钙,后續(xù)命令如果參數(shù)是相對路徑粪狼,則會基于之前命令指定的路徑。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

上面指令最終結(jié)果為:/a/b/c

ONBUILD

格式為 ONBUILD [INSTRUCTION]

配置當所創(chuàng)建的鏡像作為其他新創(chuàng)建鏡像的基礎(chǔ)鏡像時任岸,所執(zhí)行的操作指令再榄。例如:

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

Dockerfile使用上面的內(nèi)容創(chuàng)建了鏡像image-A,如果基于image-A創(chuàng)建新的鏡像時演闭,新的Dockerfile中使用FROM image-A指定基礎(chǔ)鏡像時不跟,會自動執(zhí)行ONBUILD指令內(nèi)容,等價于在Dockerfile后面添加了兩條指令米碰,如:

FROM image-A
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的鏡像窝革,推薦在標簽中注明,例如ruby:1.9-onbuild吕座。


關(guān)注我的微信公眾號:FramePower
我會不定期發(fā)布相關(guān)技術(shù)積累虐译,歡迎對技術(shù)有追求、志同道合的朋友加入吴趴,一起學(xué)習成長漆诽!


微信公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锣枝,隨后出現(xiàn)的幾起案子厢拭,更是在濱河造成了極大的恐慌,老刑警劉巖撇叁,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件供鸠,死亡現(xiàn)場離奇詭異,居然都是意外死亡陨闹,警方通過查閱死者的電腦和手機楞捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趋厉,“玉大人寨闹,你說我怎么就攤上這事【耍” “怎么了繁堡?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我帖蔓,道長矮瘟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任塑娇,我火速辦了婚禮澈侠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埋酬。我一直安慰自己哨啃,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布写妥。 她就那樣靜靜地躺著拳球,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珍特。 梳的紋絲不亂的頭發(fā)上祝峻,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音扎筒,去河邊找鬼莱找。 笑死,一個胖子當著我的面吹牛嗜桌,可吹牛的內(nèi)容都是我干的奥溺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骨宠,長吁一口氣:“原來是場噩夢啊……” “哼浮定!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起层亿,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤桦卒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匿又,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體方灾,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年琳省,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躲撰。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡针贬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拢蛋,到底是詐尸還是另有隱情桦他,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站快压,受9級特大地震影響圆仔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔫劣,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一坪郭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脉幢,春花似錦歪沃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萎羔,卻和暖如春液走,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贾陷。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工缘眶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昵宇。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓磅崭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓦哎。 傳聞我的和親對象是個殘疾皇子砸喻,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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

  • 目錄 前言 Dockerfile的書寫規(guī)則及指令使用方法 創(chuàng)建Dockerfile,構(gòu)建運行環(huán)境 構(gòu)建鏡像 Doc...
    garyond閱讀 72,328評論 0 43
  • Dockerfile 是一個文本格式的配置文件, 用戶可以使用 Dockerfile 來快速創(chuàng)建自定義的鏡像. 基...
    我相信你愛過gg閱讀 561評論 0 0
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一蒋譬、Docker 簡介 Docke...
    極客圈閱讀 10,499評論 0 120
  • “那些與你毫無關(guān)系的人割岛,就是毫無關(guān)系的,永遠是毫無關(guān)系的犯助。從認識的第一天起癣漆,其實你就知道。就算是笑得甜甜蜜蜜剂买,就算...
    小丸子不是丸子啊閱讀 321評論 0 1
  • 我懷念開春兒的蘸醬菜惠爽,婆婆丁,婆婆丁剛出來前兒灰頭土臉的瞬哼,發(fā)紫婚肆,那也挖下來,蘸雞蛋醬吃坐慰,卷餅吃较性,這是開春第一口嫩菜...
    二貨純純閱讀 118評論 0 0