Dockerfile文件詳解

如果你看到這里證明你已經(jīng)知道這個(gè)文件能做什么和怎么用了,這里就不再熬述這些,直接切入正題看看這個(gè)文件支持的各項(xiàng)功能吧!

1、FROM

語(yǔ)法:

FROM <image>[:<tag>]

解釋?zhuān)涸O(shè)置要制作的鏡像基于哪個(gè)鏡像,F(xiàn)ROM指令必須是整個(gè)Dockerfile的第一個(gè)指令,如果指定的鏡像不存在默認(rèn)會(huì)自動(dòng)從 Docker Hub上下載。

2、MAINTAINAER

語(yǔ)法:

MAINTAINER <name>

解釋?zhuān)篗AINTAINER指令允許你給將要制作的鏡像設(shè)置作者信息。

3、RUN

語(yǔ)法:

1、RUN <command>  #將會(huì)調(diào)用/bin/sh -c <command>
2、RUN ["executable", "param1", "param2"] #將會(huì)調(diào)用exec執(zhí)行,以避免有些時(shí)候shell方式執(zhí)行時(shí)的傳遞參數(shù)問(wèn)題,而且有些基礎(chǔ)鏡像可能不包含/bin/sh

解釋?zhuān)篟UN指令會(huì)在一個(gè)新的容器中執(zhí)行任何命令,然后把執(zhí)行后的改變提交到當(dāng)前鏡像,提交后的鏡像會(huì)被用于Dockerfile中定義的下一步操作,RUN中定義的命令會(huì)按順序執(zhí)行并提交,這正是Docker廉價(jià)的提交和可以基于鏡像的任何一個(gè)歷史點(diǎn)創(chuàng)建容器的好處,就像版本控制工具一樣。

4、ENTRYPOINT

語(yǔ)法:

1、ENTRYPOINT ["executable", "param1", "param2"]        #將會(huì)調(diào)用exec執(zhí)行,首選方式
2、ENTRYPOINT command param1 param2             #將會(huì)調(diào)用/bin/sh -c執(zhí)行

解釋?zhuān)篍NTRYPOINT指令中指定的命令會(huì)在鏡像運(yùn)行時(shí)執(zhí)行,在Dockerfile中只能存在一個(gè),如果使用了多個(gè)ENTRYPOINT指令,則只有最后一個(gè)指令有效。ENTRYPOINT指令中指定的命令(exec執(zhí)行的方式)可以通過(guò)docker run來(lái)傳遞參數(shù),例如docker run <images> -l啟動(dòng)的容器將會(huì)把-l參數(shù)傳遞給ENTRYPOINT指令定義的命令并會(huì)覆蓋CMD指令中定義的默認(rèn)參數(shù)(如果有的話(huà)),但不會(huì)覆蓋該指令定義的參數(shù),例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],當(dāng)通過(guò)docker run <image>啟動(dòng)容器時(shí)該容器會(huì)運(yùn)行l(wèi)s -a /etc命令,當(dāng)使用docker run <image> -l啟動(dòng)時(shí)該容器會(huì)運(yùn)行l(wèi)s -a -l命令,-l參數(shù)會(huì)覆蓋CMD指令中定義的/etc參數(shù)。

注意:
①當(dāng)使用ENTRYPOINT指令時(shí)生成的鏡像運(yùn)行時(shí)只會(huì)執(zhí)行該指令指定的命令。
②當(dāng)出現(xiàn)ENTRYPOINT指令時(shí)CMD指令只可能(當(dāng)ENTRYPOINT指令使用exec方式執(zhí)行時(shí))被當(dāng)做ENTRYPOINT指令的參數(shù)使用,其他情況則會(huì)被忽略。

5、CMD

語(yǔ)法:

1、CMD ["executable", "param1", "param2"]    #將會(huì)調(diào)用exec執(zhí)行,首選方式
2、CMD ["param1", "param2"]        #當(dāng)使用ENTRYPOINT指令時(shí),為該指令傳遞默認(rèn)參數(shù)
3、CMD <command> [ <param1>|<param2> ]        #將會(huì)調(diào)用/bin/sh -c執(zhí)行

解釋?zhuān)篊MD指令中指定的命令會(huì)在鏡像運(yùn)行時(shí)執(zhí)行,在Dockerfile中只能存在一個(gè),如果使用了多個(gè)CMD指令,則只有最后一個(gè)CMD指令有效。當(dāng)出現(xiàn)ENTRYPOINT指令時(shí),CMD中定義的內(nèi)容會(huì)作為ENTRYPOINT指令的默認(rèn)參數(shù),也就是說(shuō)可以使用CMD指令給ENTRYPOINT傳遞參數(shù)。

注意:RUN和CMD都是執(zhí)行命令,他們的差異在于RUN中定義的命令會(huì)在執(zhí)行docker build命令創(chuàng)建鏡像時(shí)執(zhí)行,而CMD中定義的命令會(huì)在執(zhí)行docker run命令運(yùn)行鏡像時(shí)執(zhí)行,另外使用第一種語(yǔ)法也就是調(diào)用exec執(zhí)行時(shí),命令必須為絕對(duì)路徑。

6、EXPOSE

語(yǔ)法:

EXPOSE <port> [.....]

解釋?zhuān)篍XPOSE指令用來(lái)告訴Docker這個(gè)容器在運(yùn)行時(shí)會(huì)暴露哪些端口,Docker在連接不同的容器(使用–link參數(shù))時(shí)使用這些信息。

7、ENV

語(yǔ)法:

ENV <key> <value>

解釋?zhuān)?br> ENV指令用于設(shè)置環(huán)境變量,在Dockerfile中這些設(shè)置的環(huán)境變量也會(huì)影響到RUN指令,當(dāng)運(yùn)行生成的鏡像時(shí)這些環(huán)境變量依然有效,如果需要在運(yùn)行時(shí)更改這些環(huán)境變量可以在運(yùn)行docker run時(shí)添加–env <key>=<value>參數(shù)來(lái)修改。

注意:最好不要定義那些可能和系統(tǒng)預(yù)定義的環(huán)境變量沖突的名字,否則可能會(huì)產(chǎn)生意想不到的結(jié)果。

8、ADD

語(yǔ)法:

ADD <src> <dest>

解釋?zhuān)?br> ADD指令用于從指定路徑拷貝一個(gè)文件或目錄到容器的指定路徑中,<src>是一個(gè)文件或目錄的路徑,也可以是一個(gè)url,路徑是相對(duì)于該Dockerfile文件所在位置的相對(duì)路徑,<dest>是目標(biāo)容器的一個(gè)絕對(duì)路徑,例如/home/yooke/Docker/Dockerfile這個(gè)文件中定義的,那么ADD /data.txt /db/指令將會(huì)嘗試拷貝文件從/home/yooke/Docker/data.txt到將要生成的容器的/db/data.txt,且文件或目錄的屬組和屬主分別為uid和gid為0的用戶(hù)和組,如果是通過(guò)url方式獲取的文件,則權(quán)限是600。

注意:
①如果執(zhí)行docker build – < somefile即通過(guò)標(biāo)準(zhǔn)輸入來(lái)創(chuàng)建時(shí),ADD指令只支持url方式,另外如果url需要認(rèn)證,則可以通過(guò)RUN wget …或RUN curl …來(lái)完成,ADD指令不支持認(rèn)證。

②<src>路徑必須與Dockerfile在同級(jí)目錄或子目錄中,例如不能使用ADD ../somepath,因?yàn)樵趫?zhí)行docker build時(shí)首先做的就是把Dockerfile所在目錄包含子目錄發(fā)送給docker的守護(hù)進(jìn)程。

③如果<src>是一個(gè)url且<dest>不是以”/“結(jié)尾,則會(huì)下載文件并重命名為<dest>。

④如果<src>是一個(gè)url且<dest>以“/”結(jié)尾,則會(huì)下載文件到<dest>/<filename>,url必須是一個(gè)正常的路徑形式,“http://example.com”像這樣的url是不能正常工作的。

*⑤如果<src>是一個(gè)本地的壓縮包且<dest>是以“/”結(jié)尾的目錄,則會(huì)調(diào)用“tar -x”命令解壓縮,如果<dest>有同名文件則覆蓋,但<src>是一個(gè)url時(shí)不會(huì)執(zhí)行解壓縮.

9、COPY

語(yǔ)法:

COPY <src> <dest>

解釋?zhuān)河梅ㄅcADD相同,不過(guò)<src>不支持使用url,所以在使用docker build – < somefile時(shí)該指令不能使用。

10、VOLUME

語(yǔ)法:

VOLUME ["samepath"]

解釋?zhuān)?br> VOLUME指令用來(lái)設(shè)置一個(gè)掛載點(diǎn),可以用來(lái)讓其他容器掛載以實(shí)現(xiàn)數(shù)據(jù)共享或?qū)θ萜鲾?shù)據(jù)的備份、恢復(fù)或遷移。

11、USER

語(yǔ)法:

USER [username|uid]

解釋?zhuān)?br> USER指令用于設(shè)置用戶(hù)或uid來(lái)運(yùn)行生成的鏡像和執(zhí)行RUN指令。

12、WORKDIR

語(yǔ)法:

WORKDIR /path/to/workdir

解釋?zhuān)?br> WORKDIR指令用于設(shè)置Dockerfile中的RUN、CMD和ENTRYPOINT指令執(zhí)行命令的工作目錄(默認(rèn)為/目錄),該指令在Dockerfile文件中可以出現(xiàn)多次,如果使用相對(duì)路徑則為相對(duì)于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當(dāng)前目錄是/data/logs。

13、ONBUILD

語(yǔ)法:

ONBUILD [INSTRUCTION]

解釋?zhuān)?br> a、ONBUILD指令可以為鏡像添加觸發(fā)器。其參數(shù)是任意一個(gè)Dockerfile 指令。
當(dāng)我們?cè)谝粋€(gè)Dockerfile文件中加上ONBUILD指令,該指令對(duì)利用該Dockerfile構(gòu)建鏡像(比如為A鏡像)不會(huì)產(chǎn)生實(shí)質(zhì)性影響。
b、但是當(dāng)我們編寫(xiě)一個(gè)新的Dockerfile文件來(lái)基于A鏡像構(gòu)建一個(gè)鏡像(比如為B鏡像)時(shí),這時(shí)構(gòu)造A鏡像的Dockerfile文件中的ONBUILD指令就生效了,在構(gòu)建B鏡像的過(guò)程中,首先會(huì)執(zhí)行ONBUILD指令指定的指令,然后才會(huì)執(zhí)行其它指令。
c、需要注意的是,如果是再利用B鏡像構(gòu)造新的鏡像時(shí),那個(gè)ONBUILD指令就無(wú)效了,也就是說(shuō)只能再構(gòu)建子鏡像中執(zhí)行,對(duì)孫子鏡像構(gòu)建無(wú)效。其實(shí)想想是合理的,因?yàn)樵跇?gòu)建子鏡像中已經(jīng)執(zhí)行了,如果孫子鏡像構(gòu)建還要執(zhí)行,相當(dāng)于重復(fù)執(zhí)行,這就有問(wèn)題了。
d、利用ONBUILD指令,實(shí)際上就是相當(dāng)于創(chuàng)建一個(gè)模板鏡像,后續(xù)可以根據(jù)該模板鏡像創(chuàng)建特定的子鏡像,需要在子鏡像構(gòu)建過(guò)程中執(zhí)行的一些通用操作就可以在模板鏡像對(duì)應(yīng)的dockerfile文件中用ONBUILD指令指定。 從而減少dockerfile文件的重復(fù)內(nèi)容編寫(xiě)。

實(shí)例(僅供參考)

FROM php:7.0-fpm

RUN sed -i 's/deb\.debian\.org/mirrors.aliyun.com/' /etc/apt/sources.list && sed -i 's/security\.debian\.org/mirrors.aliyun.com\/debian-security/' /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
    --no-install-recommends \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libmcrypt-dev \
    libpng12-dev \
 && rm -rf /var/lib/apt/lists/* \
 && docker-php-ext-configure gd \
    --with-freetype-dir=/usr \
    --with-jpeg-dir=/usr \
 && docker-php-ext-install -j$(nproc) \
    gd \
    mcrypt \
    zip \
    pdo_mysql \
    opcache \
 && rm -rf /var/www/html

COPY ./conf/php.ini /usr/local/etc/php/conf.d/
COPY ./conf/opcache-recommended.ini /usr/local/etc/php/conf.d/

RUN usermod -u 1000 www-data

WORKDIR /var/www/

14、ARG

ARG是Docker1.9 版本才新加入的指令。
ARG 定義的變量只在建立 image 時(shí)有效,建立完成后變量就失效消失
ARG指令定義了一個(gè)變量,能讓用戶(hù)可以在構(gòu)建期間使用docker build命令和其參數(shù)–build-arg =對(duì)這個(gè)變量賦值。如果用戶(hù)指定了一個(gè)構(gòu)建參數(shù)沒(méi)有定義在Dockerfile的話(huà),將輸出錯(cuò)誤。

備注:如有解釋不妥之處歡迎指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 9,005評(píng)論 1 21
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,756評(píng)論 0 120
  • 0. 前言 docker是什么?docker是用GO語(yǔ)言開(kāi)發(fā)的應(yīng)用容器引擎,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)???..
    sessionboy閱讀 4,011評(píng)論 2 49
  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,850評(píng)論 15 147
  • 本來(lái)想流逼哄哄學(xué)人家做個(gè)過(guò)程圖,還是失敗,中間擦涂顏色次數(shù)太多一不小心就手殘,不過(guò)還是有進(jìn)步,對(duì)水彩的掌控...
    窩在家的黑貓閱讀 331評(píng)論 0 0

友情鏈接更多精彩內(nèi)容