dockerfile語法規則


編寫Dockerfile

在前面的章節,我們學習了通過docker命令來下載鏡像,運行鏡像,在容器中部署自己的程序,最后將容器提交到自己的鏡像中。但是,這並不是Docker推薦的鏡像構建方式。在這一章中,我們將學習如何通過編寫Dockerfile腳本來構建和維護鏡像。

 

學習boot2docker的Dockerfles

在安裝Docker時,我們提到Docker的Windows安裝包boot2docker就是在Docker環境下編譯的。下面我們就通過boot2docker的Dockerfile腳本來初步了解Dockerfile的基礎知識。

 

FROM指令和MAINTAINER指令

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

 

RUN指令

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

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

這種格式運行程序,可以免除運行/bin/sh的消耗。這種格式使用Json格式將程序名與所需參數組成一個字符串數組,所以如果參數中有引號等特殊字符,需要進行轉義。

 

ENV指令

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

 

COPY指令和ADD指令

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

  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指令引用時,在所有其他指令執行之前先執行這些指令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM