Dockerfile中COPY和ADD之間的區別

1.簡介

創建Dockerfile時,通常需要將文件從主機系統傳輸到Docker映像中。這些可能是屬性文件,本機庫或我們的應用程序在運行時需要的其他靜態內容。

Dockerfile規範提供了兩種將文件從源系統複製到映像的方法COPYADD指令。

在本文中,我們將研究它們之間的區別以及何時使用它們之間的區別。

2. COPYADD之間的區別

乍一看, COPYADD指令看起來相同。它們具有相同的語法:

COPY <source> <destination>

 ADD <source> <destination>

兩者都將文件從主機系統複製到Docker映像。

那有什麼區別呢?簡而言之, ADD指令比COPY更有能力。

儘管功能上相似,但ADD指令在兩種方面更強大:

  • 它可以處理遠程URL
  • 它可以自動提取tar文件

讓我們更仔細地研究這些。

首先, ADD指令可以接受遠程URL作為其source參數。另一方面, COPY指令只能接受本地文件。

請注意,使用ADD來獲取遠程文件並進行複制通常並不理想。這是因為該文件將增加整個Docker映像的大小。相反,我們應該使用curlwget來獲取遠程文件,並在不再需要它們時將其刪除。

其次, ADD指令將自動將tar文件擴展到映像文件系統中。儘管這可以減少構建映像所需的Dockerfile步驟數量,但並非在所有情況下都需要這樣做。

請注意,僅當源文件在主機系統本地時才發生自動擴展。

3.何時使用ADDCOPY

根據Dockerfile最佳實踐指南除非特別需要ADD的兩個附加功能之一,否則我們始終應首選COPY不是ADD

如上所述,使用ADD將遠程文件複製到Docker映像中會創建一個額外的層並增加文件大小。如果我們改用wgetcurl ,則可以在以後刪除文件,它們不會成為Docker映像的永久部分。

此外,由於ADD命令會自動擴展tar文件和某些壓縮格式,因此可能導致意外的文件被寫入映像中的文件系統。

4。結論

在本快速教程中,我們已經看到了將文件複製到Docker映像中的兩種主要方法: ADDCOPY 。儘管功能上相似,但大多數情況下首選COPY指令。這是因為ADD指令提供了應謹慎使用且僅在需要時使用的其他功能。