1. 程式人生 > >Dockerfile中的COPY和ADD指令詳解與比較

Dockerfile中的COPY和ADD指令詳解與比較

copy和add指令詳解與比較

Dockerfile中的COPY指令和ADD指令都可以將主機上的資源復制或加入到容器鏡像中,都是在構建鏡像的過程中完成的。

COPY指令和ADD指令的唯一區別在於是否支持從遠程URL獲取資源。COPY指令只能從執行docker build所在的主機上讀取資源並復制到鏡像中。而ADD指令還支持通過URL從遠程服務器讀取資源並復制到鏡像中。

滿足同等功能的情況下,推薦使用COPY指令。ADD指令更擅長讀取本地tar文件並解壓縮。


1. COPY指令

COPY指令能夠將構建命令所在的主機本地的文件或目錄,復制到鏡像文件系統。

exec格式用法(推薦):
COPY ["<src>",... "<dest>"],推薦,特別適合路徑中帶有空格的情況

shell格式用法:
COPY <src>... <dest>


2. ADD指令
ADD指令不僅能夠將構建命令所在的主機本地的文件或目錄,而且能夠將遠程URL所對應的文件或目錄,作為資源復制到鏡像文件系統。
所以,可以認為ADD是增強版的COPY,支持將遠程URL的資源加入到鏡像的文件系統。

exec格式用法(推薦):
ADD ["<src>",... "<dest>"],特別適合路徑中帶有空格的情況

shell格式用法:
ADD <src>... <dest>


說明,對於從遠程URL獲取資源的情況,由於ADD指令不支持認證,如果從遠程獲取資源需要認證,則只能使用RUN wget或RUN curl替代。

另外,如果源路徑的資源發生變化,則該ADD指令將使Docker Cache失效,Dockerfile中後續的所有指令都不能使用緩存。因此盡量將ADD指令放在Dockerfile的後面。


3. COPY指令和ADD指令的用法非常相似,具體註意事項如下:


  • 源路徑可以有多個

  • 源路徑是相對於執行build的相對路徑

  • 源路徑如果是本地路徑,必須是build上下文中的路徑

  • 源路徑如果是一個目錄,則該目錄下的所有內容都將被加入到容器,但是該目錄本身不會

  • 目標路徑必須是絕對路徑,或相對於WORKDIR的相對路徑

  • 目標路徑如果不存在,則會創建相應的完整路徑

  • 目標路徑如果不是一個文件,則必須使用/結束

  • 路徑中可以使用通配符

4. 讀取URL遠程資源


[html] view plain copy

  1. RUN mkdir -p /usr/src/things \

  2. && curl -SL http://example.com/big.tar.xz \

  3. | tar -xJC /usr/src/things \

  4. && make -C /usr/src/things all



事實上,當要讀取URL遠程資源的時候,並不推薦使用ADD指令,而是建議使用RUN指令,在RUN指令中執行wget或curl命令。


Dockerfile中的COPY和ADD指令詳解與比較