Dockerfile文件詳解

文章出處:https://www.cnblogs.com/panwenbin-logs/p/8007348.html
Dockerfile文件詳解

什么是dockerfile?

Dockerfile是一個包含用于組合映像的命令的文本文檔。可以使用在命令行中調(diào)用任何命令购公。 Docker通過讀取Dockerfile中的指令自動生成映像笙蒙。

docker build命令用于從Dockerfile構建映像凯旋∮啵可以在docker build命令中使用-f標志指向文件系統(tǒng)中任何位置的Dockerfile送悔。

例:

docker build -f /path/to/a/Dockerfile

Dockerfile的基本結構

Dockerfile 一般分為四部分:基礎鏡像信息艘款、維護者信息、鏡像操作指令和容器啟動時執(zhí)行指令突想,’#’ 為 Dockerfile 中的注釋殴蹄。

Dockerfile文件說明

Docker以從上到下的順序運行Dockerfile的指令。為了指定基本映像猾担,第一條指令必須是FROM袭灯。一個聲明以#字符開頭則被視為注釋±萏剑可以在Docker文件中使用RUN妓蛮,CMD,F(xiàn)ROM圾叼,EXPOSE蛤克,ENV等指令。

在這里列出了一些常用的指令夷蚊。

FROM:指定基礎鏡像构挤,必須為第一個命令

格式:

  FROM <image>

  FROM <image>:<tag>

  FROM <image>@<digest>

示例:

  FROM mysql:5.6

注:

  tag或digest是可選的,如果不使用這兩個值時惕鼓,會使用latest版本的基礎鏡像


MAINTAINER:?維護者信息

格式:

??????? MAINTAINER? <name>

示例:

??????? MAINTAINER Jasper Xu MAINTAINER sorex@163.com

? ? ? ? MAINTAINER Jasper Xu


RUN:構建鏡像時執(zhí)行的命令

RUN用于在鏡像容器中執(zhí)行命令筋现,其有以下兩種命令執(zhí)行方式:

shell執(zhí)行

格式:

? ? RUN <command>

exec執(zhí)行

格式:

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

示例:

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

? ? RUN apk update

? ? RUN ["/etc/execfile", "arg1", "arg1"]

注:

  RUN指令創(chuàng)建的中間鏡像會被緩存,并會在下次構建中使用。如果不想使用這些緩存鏡像矾飞,可以在構建時指定--no-cache參數(shù)一膨,如:docker build --no-cache


ADD:將本地文件添加到容器中,tar類型文件會自動解壓(網(wǎng)絡壓縮資源不會被解壓)洒沦,可以訪問網(wǎng)絡資源豹绪,類似wget

格式:

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

? ? ADD ["<src>",... "<dest>"] 用于支持包含空格的路徑

示例:

? ? ADD hom* /mydir/? ? ? ? ? # 添加所有以"hom"開頭的文件

? ? ADD hom?.txt /mydir/? ? ? # ? 替代一個單字符,例如:"home.txt"

? ? ADD test relativeDir/? ? # 添加 "test" 到 `WORKDIR`/relativeDir/

? ? ADD test /absoluteDir/? ? # 添加 "test" 到 /absoluteDir/


COPY:功能類似ADD,但是是不會自動解壓文件申眼,也不能訪問網(wǎng)絡資源

CMD:構建容器后調(diào)用瞒津,也就是在容器啟動時才進行調(diào)用

格式:

? ? CMD ["executable","param1","param2"] (執(zhí)行可執(zhí)行文件,優(yōu)先)

? ? CMD ["param1","param2"] (設置了ENTRYPOINT括尸,則直接調(diào)用ENTRYPOINT添加參數(shù))

? ? CMD command param1 param2 (執(zhí)行shell內(nèi)部命令)

示例:

? ? CMD echo "This is a test." | wc -

? ? CMD ["/usr/bin/wc","--help"]

注:

  CMD不同于RUN巷蚪,CMD用于指定在容器啟動時所要執(zhí)行的命令,而RUN用于指定鏡像構建時所要執(zhí)行的命令濒翻。


ENTRYPOINT:配置容器屁柏,使其可執(zhí)行化。配合CMD可省去"application"有送,只使用參數(shù)前联,在docker run的時候后面可也跟參數(shù),然后ENTRYPOINT執(zhí)行的命令可通過CMD接收到這些參數(shù)娶眷,然后執(zhí)行命令。

格式:

? ? ENTRYPOINT ["executable", "param1", "param2"] (可執(zhí)行文件, 優(yōu)先)

? ? ENTRYPOINT command param1 param2 (shell內(nèi)部命令)

示例:

? ? FROM ubuntu

? ? ENTRYPOINT ["top", "-b"]

? ? CMD ["-c"]

注:

   ENTRYPOINT與CMD非常類似啸臀,不同的是通過docker run執(zhí)行的命令不會覆蓋ENTRYPOINT届宠,而docker run命令中指定的任何參數(shù),都會被當做參數(shù)再次傳遞給ENTRYPOINT乘粒。Dockerfile中只允許有一個ENTRYPOINT命令豌注,多指定時會覆蓋前面的設置,而只執(zhí)行最后的ENTRYPOINT指令灯萍。


LABEL:用于為鏡像添加元數(shù)據(jù)

格式:LABEL= = =...示例:LABEL version="1.0"description="這是一個Web服務器"by="IT筆錄"注:使用LABEL指定元數(shù)據(jù)時轧铁,一條LABEL指定可以指定一或多條元數(shù)據(jù),指定多條元數(shù)據(jù)時不同元數(shù)據(jù)之間通過空格分隔旦棉。推薦將所有的元數(shù)據(jù)通過一條LABEL指令指定齿风,以免生成過多的中間鏡像。


ENV:設置環(huán)境變量

格式:

? ? ENV <key> <value>? #<key>之后的所有內(nèi)容均會被視為其<value>的組成部分绑洛,因此救斑,一次只能設置一個變量

? ? ENV <key>=<value> ...? #可以設置多個變量,每個變量為一個"<key>=<value>"的鍵值對真屯,如果<key>中包含空格脸候,可以使用\來進行轉義,也可以通過""來進行標示;另外运沦,反斜線也可以用于續(xù)行

示例:

? ? ENV myName John Doe

? ? ENV myDog Rex The Dog

? ? ENV myCat=fluffy


EXPOSE:指定于外界交互的端口

格式:

? ? EXPOSE <port> [<port>...]

示例:

? ? EXPOSE 80 443

? ? EXPOSE 8080

? ? EXPOSE 11211/tcp 11211/udp

注:

  EXPOSE并不會讓容器的端口訪問到主機泵额。要使其可訪問,需要在docker run運行容器時通過-p來發(fā)布這些端口携添,或通過-P參數(shù)來發(fā)布EXPOSE導出的所有端口


VOLUME:用于指定持久化目錄

格式:

? ? VOLUME ["/path/to/dir"]

示例:

? ? VOLUME ["/data"]

? ? VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"

注:

  一個卷可以存在于一個或多個容器的指定目錄嫁盲,該目錄可以繞過聯(lián)合文件系統(tǒng),并具有以下功能:

卷可以容器間共享和重用

容器并不一定要和其它容器共享卷

修改卷后會立即生效

對卷的修改不會對鏡像產(chǎn)生影響

卷會一直存在薪寓,直到?jīng)]有任何容器在使用它


WORKDIR:工作目錄亡资,類似于cd命令

格式:

? ? WORKDIR /path/to/workdir

示例:

? ? WORKDIR /a? (這時工作目錄為/a)

? ? WORKDIR b? (這時工作目錄為/a/b)

? ? WORKDIR c? (這時工作目錄為/a/b/c)

注:

  通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN向叉、CMD锥腻、ENTRYPOINT、ADD母谎、COPY等命令都會在該目錄下執(zhí)行瘦黑。在使用docker run運行容器時,可以通過-w參數(shù)覆蓋構建時所設置的工作目錄奇唤。


USER:指定運行容器時的用戶名或 UID幸斥,后續(xù)的 RUN 也會使用指定用戶。使用USER指定用戶時咬扇,可以使用用戶名甲葬、UID或GID,或是兩者的組合懈贺。當服務不需要管理員權限時经窖,可以通過該命令指定運行用戶。并且可以在之前創(chuàng)建所需要的用戶

格式:

  USER user

  USER user:group

  USER uid

  USER uid:gid

  USER user:gid

  USER uid:group

示例:

? ?   USER www

注:

  使用USER指定用戶后梭灿,Dockerfile中其后的命令RUN画侣、CMD、ENTRYPOINT都將使用該用戶堡妒。鏡像構建完成后配乱,通過docker run運行容器時,可以通過-u參數(shù)來覆蓋所指定的用戶皮迟。


ARG:用于指定傳遞給構建運行時的變量

格式:

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

示例:

??????? ARG site

??????? ARG build_user=www


ONBUILD:用于設置鏡像觸發(fā)器

格式:

  ONBUILD [INSTRUCTION]

示例:

  ONBUILD ADD . /app/src

  ONBUILD RUN /usr/local/bin/python-build --dir /app/src

注:

  當所構建的鏡像被用做其它鏡像的基礎鏡像搬泥,該鏡像中的觸發(fā)器將會被鑰觸發(fā)

以下是一個小例子:

# This my first nginx Dockerfile

# Version 1.0

# Base images 基礎鏡像

FROM centos

#MAINTAINER 維護者信息

MAINTAINER tianfeiyu

#ENV 設置環(huán)境變量

ENV PATH /usr/local/nginx/sbin:$PATH

#ADD? 文件放在當前目錄下,拷過去會自動解壓

ADD nginx-1.8.0.tar.gz /usr/local/?

ADD epel-release-latest-7.noarch.rpm /usr/local/?

#RUN 執(zhí)行以下命令

RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm

RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all

RUN useradd -s /sbin/nologin -M www

#WORKDIR 相當于cd

WORKDIR /usr/local/nginx-1.8.0

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口

EXPOSE 80

#CMD 運行以下命令

CMD ["nginx"]


最后用一張圖解釋常用指令的意義^-^:


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末万栅,一起剝皮案震驚了整個濱河市佑钾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烦粒,老刑警劉巖休溶,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代赁,死亡現(xiàn)場離奇詭異,居然都是意外死亡兽掰,警方通過查閱死者的電腦和手機芭碍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孽尽,“玉大人窖壕,你說我怎么就攤上這事∩寂” “怎么了瞻讽?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熏挎。 經(jīng)常有香客問我速勇,道長,這世上最難降的妖魔是什么坎拐? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任烦磁,我火速辦了婚禮,結果婚禮上哼勇,老公的妹妹穿的比我還像新娘都伪。我一直安慰自己,他們只是感情好积担,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布陨晶。 她就那樣靜靜地躺著,像睡著了一般帝璧。 火紅的嫁衣襯著肌膚如雪珍逸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天聋溜,我揣著相機與錄音,去河邊找鬼叭爱。 笑死撮躁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的买雾。 我是一名探鬼主播把曼,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漓穿!你這毒婦竟也來了嗤军?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晃危,失蹤者是張志新(化名)和其女友劉穎叙赚,沒想到半個月后老客,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡震叮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年胧砰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苇瓣。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡尉间,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出击罪,到底是詐尸還是另有隱情哲嘲,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布媳禁,位于F島的核電站眠副,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏损话。R本人自食惡果不足惜侦啸,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丧枪。 院中可真熱鬧光涂,春花似錦、人聲如沸拧烦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋博。三九已至齐佳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間债沮,已是汗流浹背炼吴。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疫衩,地道東北人硅蹦。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像闷煤,于是被迫代替她去往敵國和親童芹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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