Dockerfile 中的“COPY”和“ADD”命令有什麼區別?


在建立 Dockerfile 時,您可以使用兩種不同的命令來構建您的上下文。構建上下文意味著包含您希望從本地機器中獲取的檔案和目錄,以便在建立容器時將其包含在容器中。這些檔案可能是您本地機器中的目錄,您想要從中下載檔案的 URL,或者您想要按原樣包含或解壓縮後包含的壓縮 tarball 檔案。

我們可以使用兩個不同的指令將本地機器構建上下文中的檔案新增到 Docker 容器中。這些指令是 COPY 和 ADD 指令。儘管它們執行幾乎相同的任務,但它們的工作方式略有不同。因此,這裡的問題是我們為什麼需要兩個不同的命令來執行相同的工作,以及我們應該使用哪一個?

在本文中,我們將討論相同的內容。因此,事不宜遲,讓我們討論 ADD 和 COPY 指令的用例。

ADD 指令

我們在 Dockerfile 中使用的 ADD 指令是一個比較舊的指令,從 Docker 的誕生之初就存在。ADD 指令的功能不僅僅是從本地主機複製目錄或檔案。我們可以使用 ADD 指令從外部連結/URL(如 Github、Bitbucket 等)拉取檔案或目錄。ADD 指令還可以用於解壓縮諸如存檔或 tarball 檔案之類的壓縮檔案。但是,如果您實際上不想提取存檔,有時可能會導致問題。

ADD 指令的語法為 -

$ ADD <source path> <destination path>

ADD 指令的一些重要用例包括 -

  • 將檔案和目錄從本地機器複製到映象。

例如,如果我們想簡單地將本地主機系統中 /home/user/Dekstop/app 目錄中的檔案複製到 Docker 映象中的 /app 目錄,我們可以將此指令嵌入到 Dockerfile 中 -

$ ADD /home/user/Desktop/app /app

在這種情況下,守護程式僅將源目錄的內容複製到目標目錄,包括元資料。由於我們沒有提到尾隨斜槓,因此它不會複製目錄本身。

  • 解壓縮本地儲存的 tarball 檔案。

ADD 指令還可以用於解壓縮具有以下格式的壓縮 tarball 檔案或存檔 - bzip2、xz、gzip2。ADD 指令會自動將內容提取到 Docker 容器中目標資料夾內建立的目錄中。例如,如果我們想將 sample.tar.gz 檔案提取到容器內的 /app 目錄,我們可以使用以下命令。

$ ADD /home/user/sample.tar.gz /app

這與我們在主機機器中使用 tarball 命令解壓縮 tarball 的操作完全相同。

  •  從 URL 下載目錄或檔案

ADD 指令的此功能類似於 wget -P 命令的工作原理。當我們嘗試構建 Docker 映象時,可以使用 ADD 指令直接從給定的 URL 下載檔案並將其儲存在容器內的某個位置。執行此操作的命令為 -

$ ADD
https://www.asamplelink.com/test/sampledocuments/mysamplefile.pdf /app

構建映象完成後,在啟動容器時可以訪問這些檔案。

COPY 指令

我們可以將 Dockerfile 中的 COPY 指令視為 ADD 指令的演進版本。建立 COPY 指令是為了消除 Docker 開發人員之間的混淆。COPY 指令的唯一功能是從主機機器上的源目錄複製檔案到容器上的目標目錄。如果我們將源指定為 tarball 檔案,它不會在容器內解壓縮它,而是按原樣複製它。

此外,COPY 指令不接受 URL 引數作為源。使用 COPY 指令複製檔案的語法為 -

$ COPY <source> <destination>

示例 -

$ COPY /home/user/sample/files /app

最終想法!

總之,如果您希望簡單地將檔案和目錄從本地主機複製到容器環境,建議您僅使用 COPY 指令。您必須儘可能避免使用 ADD 指令。如果要提取或下載檔案,可以使用 RUN 指令以及正常的 Linux 命令。

在本文中,我們討論瞭如何使用 ADD 和 COPY Dockerfile 指令、它們的用例、兩者之間的根本區別以及一些動手示例和命令。

更新於: 2021年8月7日

504 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.