如果你看到這里證明你已經(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ò)誤。
備注:如有解釋不妥之處歡迎指正。