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替代。
3. COPY指令和ADD指令的用法非常相似,具體註意事項如下:
源路徑可以有多個
源路徑是相對於執行build的相對路徑
源路徑如果是本地路徑,必須是build上下文中的路徑
源路徑如果是一個目錄,則該目錄下的所有內容都將被加入到容器,但是該目錄本身不會
目標路徑必須是絕對路徑,或相對於WORKDIR的相對路徑
目標路徑如果不存在,則會創建相應的完整路徑
目標路徑如果不是一個文件,則必須使用/結束
路徑中可以使用通配符
4. 讀取URL遠程資源
[html] view plain copy
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
事實上,當要讀取URL遠程資源的時候,並不推薦使用ADD指令,而是建議使用RUN指令,在RUN指令中執行wget或curl命令。
Dockerfile中的COPY和ADD指令詳解與比較