版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/46291461
在本篇中将介紹Dockerfile的編寫
除了通過修改Image,建立Container,在打包成Image來建立我們需要的Image之外
我們還可以編寫Dockerfile檔案,通過build來建立我們需要的Image
Dockerfile是一個檔案名,Docker規定必須是這樣子來命名的
Dockerfile放在項目的根目錄
通過docker build -t {鏡像的名字} {項目的路徑}
來讀取Dockerfile中的代碼自動建構一個Image
Dockerfile中每一行指令執行完之後都會送出成為一個Image,這樣保證了指令之間不會有影響
而且Docker會盡可能的嘗試複用之前的Image
可以通過在build指令中添加–no-cache方式來取消這種cache複用方式
Dockerfile中隻支援自己定義的那套指令,在書寫時建議全部使用大寫
FROM {base Image}
必須放在Dockerfile的第一行,表示從哪個Image開始建構
MAINTAINER
可選的,用來辨別Image作者
RUN
每個RUN指令都會是在新的Container中執行,并送出為Image,作為下一個RUN的base image
RUN[“executable”,”arg1”,…]
CMD
在Dockerfile中定義的CMD指令,在送出成Image的時候不會起作用,隻有當使用這個Image來建立一個Container的時候,會在Container内部預設執行這條CMD指令
一個Dockerfile中隻能有一個有效的CMD
當運作Container時如果指定了command,那麼将會覆寫預設設定的這個CMD
下面來編寫一個Demo Dockerfile
在/test目錄下建立Dockerfile
FROM busybox:ubuntu-14.04
RUN touch /test.sh
CMD ["ls","-al","/"]
//預設執行ls -al /
//外部可以通過ls -al /usr甚至是ps -al來覆寫原有的command
使用build來建構Image
docker build -t jchubby/testimage /test
//-t [image名] [Dockerfile目錄]
運作結果如下:
ENTRYPOINT
之前的CMD是定義預設的command指令,但是在運作container的時候可以執行另外的command來覆寫原先的command
ENTRYPOINT的作用是在運作container的時候,設定預設要執行的command指令,是不可修改的,但是可以傳不同的參數給這個command指令得到不同的結果
一個Dockerfile中隻能有一個有效的ENTRYPOINT
使用ENTRYPOINT
FROM busybox:ubuntu-14.04
RUN touch /test.sh
ENTRYPOINT ["ls","-al"]
CMD["/"]
//預設會執行ls -al /
//外部隻能通過傳不同的路徑,來得到對應目錄的檔案,隻能使用ls指令
ADD©
将host上的檔案或目錄複制到Image中,ADD如果是一個URL的情況下,會将其下載下傳到指定的目錄
FROM busybox:ubuntu-14.04
RUN touch /test.sh
ADD http://.... /test/..
//将指定網址的資源下載下傳到/test/..檔案中
ENTRYPOINT ["ls","-al"]
CMD["/"]
其他的一些Dockerfile指令
ENV
ENV key value
用來設定環境變量,後續的RUN可以使用其建立的環境變量
建立基于該Image的Container時也會自動擁有這些環境變量
WORKDIR
指定目前的工作目錄
USER
指定在RUN的時候使用哪個使用者
ONBUILD
類似于一個觸發器,比如Image a的Dockerfile中制定了ONBUILD,Image b的Dockerfile指定FROM Image a,那麼在建構Image b的時候會先執行Image a中的ONBUILD指定的操作(ONBUILD後面跟的是Dockerfile的指令)
VOLUME
通過VOLUME[“path1”,”path2”,…]
來指定某些目錄為Container之間可以共享資料,通路的目錄