dockerfile語法規則

編寫Dockerfile

在前面的章節,咱們學習了經過docker命令來下載鏡像,運行鏡像,在容器中部署本身的程序,最後將容器提交到本身的鏡像中。可是,這並非Docker推薦的鏡像構建方式。在這一章中,咱們將學習如何經過編寫Dockerfile腳原本構建和維護鏡像。mysql

 

學習boot2docker的Dockerfles

在安裝Docker時,咱們提到Docker的Windows安裝包boot2docker就是在Docker環境下編譯的。下面咱們就經過boot2docker的Dockerfile腳原本初步瞭解Dockerfile的基礎知識。linux

 

FROM指令和MAINTAINER指令

腳本的第1行是FROM指令。經過FROM指令,docker編譯程序可以知道在哪一個基礎鏡像執行來進行編譯。全部的Dockerfile都必須以FROM指令開始。第二條指令MAINTAINER,用來標明這個鏡像的維護者信息。nginx

 

RUN指令

接下來是RUN指令。這條指令用來在docker的編譯環境中運行指定命令。上面這條指令會在編譯環境運行/bin/sh -c "apt-get update && apt-get -y install ..."RUN指令還有另一種格式:git

RUN ["程序名", "參數1", "參數2"]

這種格式運行程序,能夠免除運行/bin/sh的消耗。這種格式使用Json格式將程序名與所需參數組成一個字符串數組,因此若是參數中有引號等特殊字符,須要進行轉義。github

 

ENV指令

ENV指令用來指定在執行docker run命令運行鏡像時,自動設置的環境變量。這些環境變量能夠經過docker run命令的--evn參數來進行修改。sql

 

COPY指令和ADD指令

COPY指令用來將本地(Dockerfile所在位置)的文件或文件夾複製到編譯環境的指定路徑下。上面的例子裏,boot2docker的Dockerfile但願將與Dockerfile同一目錄下的kernel_config文件複製到編譯環境的/linux-kernal/.config。Dockerfile還提供了另一個相似的指令:ADD。在複製文件方面ADD指令和COPY指令的格式和效果是徹底同樣的。這兩個指令的區別主要由兩點:docker

  1. ADD指令能夠從一個URL地址下載內容複製到容器的文件系統中;
  2. ADD指令會將壓縮打包格式的文件解開後複製到指定位置,而COPY指令只作複製操做。

 

CMD指令

這是整個Dockerfile腳本的最後一條指令。當Dockerfile已經完成了全部環境的安裝與配置,經過CMD指令來指示docker run命令運行鏡像時要執行的命令。上面的例子裏,在完成全部工做後,boot2docker的編譯腳本將編譯結果輸出到本地環境下。數據庫

 

其餘指令

上面咱們經過boot2docker的Dockerfile腳本學習了幾個最經常使用的指令。接下來咱們再學習剩下的幾個指令。數組

 

EXPOSE指令

EXPOSE <端口> [<端口>...]指令用於標明,這個鏡像中的應用將會偵聽某個端口,而且但願能將這個端口映射到主機的網絡界面上。可是,爲了安全,docker run命令若是沒有帶上響應的端口映射參數,docker並不會將端口映射出了。安全

 

ENTRYPOINT指令

ENTRYPOINT指令和前面介紹過的CMD同樣,用於標明一個鏡像做爲容器運行時,最後要執行的程序或命令。這兩個指令有相同之處,也有區別。經過兩個指令的配合使用能夠配置出不一樣的效果。

ENTRYPOINT指令有兩種格式,CMD指令有三種格式:

ENTRYPOINT ["程序名", "參數1", "參數2"]
ENTRYPOINT 命令 參數1 參數2

CMD ["程序名", "參數1", "參數2"]
CMD 命令 參數1 參數2
CMD 參數1 參數2

ENTRYPOINT是容器運行程序的入口。也就是說,在docker run命令中指定的命令都將做爲參數提供給ENTRYPOINT指定的程序。一樣,上面列舉的CMD指令格式的後面兩種格式也將做爲參數提供給ENTRYPOINT指定的程序。

默認的ENTRYPOINT/bin/sh -c。你能夠根據實際須要任意設置。可是若是在一個Dockerfile中出現了多個ENTRYPOINT指令,那麼,只有最後一個ENTRYPOINT指令是起效的。

一種經常使用的設置是將命令與必要參數設置到ENTRYPOINT中,而運行時只提供其餘選項。例如:你有一個MySQL的客戶端程序運行在容器中,而客戶端所須要的主機地址、用戶名和密碼你不但願每次都輸入,你就能夠將ENTRYPOINT設置成:ENTRYPOINT mysql -u <用戶名> -p <密碼> -h <主機名>。而你運行時,只須要指定數據庫名。

 

VOLUME指令

VOLUME ["路徑"]

VOLUME指令用於在容器內建立一個或多個卷。而更多的時候,是在執行docker run時指定要建立的卷以及本地路徑來進行映射。關於這個用法將在後面的章節學習到。

 

USER指令

USER 用戶名或用戶ID

USER指令用於容器內運行RUN指令或CMD指令的用戶。例如,在構建一個nginx鏡像時,你但願最後運行nginx的用戶爲nginx,就能夠在CMD ["nginx"]以前將用戶設置爲nginx

若是在運行docker run命令時設置了-u 用戶名參數,那麼將覆蓋USER指令設置的用戶。

 

WORKDIR指令

WORKDIR 路徑

WORKDIR指令用於設置執行RUN指令、CMD指令和ENTRYPOINT指令執行時的工做目錄。在Dockerfile中能夠屢次設置WORKDIR,在每次設置以後的命令將使用新的路徑。

 

ONBUILD指令

ONBUILD 指令

ONBUILD指令用於設置一些指令,當本鏡像做爲基礎鏡像被其餘Dockerfile用FROM指令引用時,在全部其餘指令執行以前先執行這些指令。

相關文章
相關標籤/搜索