天天看點

Docker解析及輕量級PaaS平台演練(三)--Dockerfile編寫

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 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&COPY

将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之間可以共享資料,通路的目錄