Docker通過對于在Dockerfile中的一系列指令的順序解析實(shí)現(xiàn)自動(dòng)的image的構(gòu)建。

通過使用build命令,根據(jù)Dockerfile的描述來構(gòu)建鏡像。
??只支持Docker自己定義的一套指令,不支持自定義
??大小寫不敏感,但是建議全部使用大寫
??根據(jù)Dockerfile的內(nèi)容順序執(zhí)行
FROM指令
??FROM {base鏡像}
??必須放在DOckerfile的第一行,表示從哪個(gè)baseimage開始構(gòu)建
MAINTAINER
MAINTAINER: xxx
可選的,用來標(biāo)識image作者的地方
RUN
??每一個(gè)RUN指令都會(huì)是在一個(gè)新的container里面運(yùn)行,并提交為一個(gè)image作為下一個(gè)RUN的base
??一個(gè)Dockerfile中可以包含多個(gè)RUN,按定義順序執(zhí)行
??RUN支持兩種運(yùn)行方式:
????RUN <cmd> 這個(gè)會(huì)當(dāng)作/bin/sh -c “cmd” 運(yùn)行
????RUN [“executable”,“arg1”,。。],Docker把他當(dāng)作json的順序來解析,因此必須使用雙引號,而且executable需要是完整路徑
??RUN?都是啟動(dòng)一個(gè)容器、執(zhí)行命令、然后提交存儲層文件變更。第一層?RUN command1?的執(zhí)行僅僅是當(dāng)前進(jìn)程,一個(gè)內(nèi)存上的變化而已,其結(jié)果不會(huì)造成任何文件。而到第二層的時(shí)候,啟動(dòng)的是一個(gè)全新的容器,跟第一層的容器更完全沒關(guān)系,自然不可能繼承前一層構(gòu)建過程中的內(nèi)存變化。而如果需要將兩條命令或者多條命令聯(lián)合起來執(zhí)行需要加上&&。如:cd /usr/local/src && wget xxxxxxx
ADD & COPY
??當(dāng)在源代碼構(gòu)建的方式下,可以通過ADD和COPY的方式,把host上的文件或者目錄復(fù)制到image中
??ADD和COPY的源必須在context路徑下
??當(dāng)src為網(wǎng)絡(luò)URL的情況下,ADD指令可以把它下載到dest的指定位置,這個(gè)在任何build的方式下都可以work
??ADD相對COPY還有一個(gè)多的功能,能夠進(jìn)行自動(dòng)解壓壓縮包
ENV
??ENV key value
??用來設(shè)置環(huán)境變量,后續(xù)的RUN可以使用它所創(chuàng)建的環(huán)境變量
??當(dāng)創(chuàng)建基于該鏡像的container的時(shí)候,會(huì)自動(dòng)擁有設(shè)置的環(huán)境變量
CMD
??CMD的作用是作為執(zhí)行container時(shí)候的默認(rèn)行為(容器默認(rèn)的啟動(dòng)命令)
??當(dāng)運(yùn)行container的時(shí)候聲明了command,則不再用image中的CMD默認(rèn)所定義的命令
??一個(gè)Dockerfile中只能有一個(gè)有效的CMD,當(dāng)定義多個(gè)CMD的時(shí)候,只有最后一個(gè)才會(huì)起作用
CMD定義的三種方式:
??CMD <cmd> 這個(gè)會(huì)當(dāng)作/bin/sh -c "cmd"來執(zhí)行
??CMD ["executable","arg1",....]
??CMD ["arg1","arg2"],這個(gè)時(shí)候CMD作為ENTRYPOINT的參數(shù)
示例1 :以最常用的tomcat為示例