Dockerfile中相似命令

23云恋49枫發表於2024-09-09

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中執行長時間執行的命令,因為這樣會導致容器啟動時長時間阻塞。

相關文章