ARG和ENV
ARG主要用於構建時的引數傳遞,不會保留在生成的映象中,適用於需要根據不同構建條件動態調整構建過程的場景;
ENV主要用於設定容器執行時的環境變數,這些變數會保留在生成的映象中,並且在容器啟動時可用,適用於需要在容器內部配置應用程式或指令碼的場景;
# 定義一個構建時變數 ARG HTTP_PREFIX=/usr/local/apache2 # 使用變數來配置Apache的文件根目錄(僅在構建過程中有效) RUN echo "DocumentRoot ${HTTP_PREFIX}/htdocs" > /etc/apache2/apache2.conf # 設定環境變數 ENV NAME=World # 在容器內部使用環境變數 CMD echo "Hello, $NAME!"
COPY和ADD
COPY 指令從 <src> 複製新的檔案或目錄,並將它們新增到 Docker 容器檔案系統的 <dest> 的路徑下。
ADD
指令和 COPY
指令的格式和性質基本一致,但是在 COPY
基礎上增加了一些功能。
ADD
指令有一些額外的功能 :
ADD
指令可以讓你使用 URL 作為<src>
引數。當遇到 URL 時候,可以透過 URL 下載檔案並且複製到<dest>
(容器中目標路徑)。ADD
的另一個特性是自動解壓檔案的能力。如果<src>
引數是一個可識別壓縮格式(tar
,gzip
,bzip2
…)的本地檔案(注:無法實現同時下載並解壓),就會被解壓到指定容器檔案系統的路徑<dest>
下。
RUN、CMD、ENTRYPOINT和SHELL
RUN命令
用於在構建映象時執行命令,每執行一次會生成一個新的映象層。 通常用於安裝軟體包、更新系統、設定環境變數等。 示例:RUN apt-get update && apt-get install -y package
CMD命令
定義容器啟動後預設執行的命令,可以在Dockerfile中指定一次,也可以在docker run命令中覆蓋。 只能有一個CMD指令,多個CMD指令只有最後一個生效。 示例:CMD ["executable","param1","param2"]
ENTRYPOINT命令
定義容器啟動時執行的命令,可以結合CMD使用,CMD提供預設引數。 允許容器作為可執行程式被呼叫,使得容器像一個可以直接執行的命令一樣使用。 示例:ENTRYPOINT ["executable", "param1", "param2"]
SHELL命令
用於指定Dockerfile中後續命令執行時所使用的shell,預設為/bin/sh -c。 可以在Dockerfile中設定為不同的shell,比如/bin/bash。 示例:SHELL ["/bin/bash", "-c"]
注意事項
RUN、CMD、ENTRYPOINT命令可以在Dockerfile中以不同的順序組合使用,但通常建議先使用RUN,然後CMD和ENTRYPOINT。
在Dockerfile中可以多次使用RUN命令,但要注意合併命令以減少層數。
使用ENTRYPOINT時,可以透過docker run命令傳遞引數來覆蓋預設引數。
時,可以透過docker run命令傳遞引數來覆蓋預設引數。
儘量避免在CMD中執行長時間執行的命令,因為這樣會導致容器啟動時長時間阻塞。