docker container cp

說明在容器和本地檔案系統之間複製檔案/資料夾
用法docker container cp [選項] 容器:來源路徑 目的路徑|- docker cp [選項] 來源路徑|- 容器:目的地路徑
別名
docker cp

說明

docker cp 工具會將 來源路徑 的內容複製到 目的地路徑。您可以從容器的檔案系統複製到本地機器,反之亦然,從本地檔案系統複製到容器。如果為 來源路徑目的地路徑 指定 -,您也可以從 STDIN 串流 tar 封存或到 STDOUT容器 可以是正在執行或已停止的容器。來源路徑目的地路徑 可以是檔案或目錄。

docker cp 指令假設容器路徑相對於容器的 /(根)目錄。這表示提供初始正斜線是可選的;該指令將 compassionate_darwin:/tmp/foo/myfile.txtcompassionate_darwin:tmp/foo/myfile.txt 視為相同。本地機器路徑可以是絕對值或相對值。該指令將本地機器的相對路徑解釋為相對於執行 docker cp 的目前工作目錄。

cp 指令的行為類似於 Unix cp -a 指令,如果可能,目錄會以遞迴方式複製並保留權限。所有權設定為目的地使用者和主要群組。例如,複製到容器的檔案會使用 root 使用者的 UID:GID 建立。複製到本地機器的檔案會使用叫用 docker cp 指令的使用者 UID:GID 建立。但是,如果您指定 -a 選項,docker cp 會將所有權設定為來源的使用者和主要群組。如果您指定 -L 選項,docker cp 會遵循 來源路徑 中的任何符號連結。如果 目的地路徑 的父目錄不存在,docker cp 不會建立它們。

假設路徑分隔符號為 /,第一個參數為 來源路徑,第二個參數為 目的地路徑,行為如下:

  • 來源路徑 指定一個檔案
    • 目的地路徑 不存在
      • 檔案會儲存到在 目的地路徑 建立的檔案中
    • 目的地路徑 不存在且以 / 結尾
      • 錯誤情況:目的地目錄必須存在。
    • 目的地路徑 存在且是一個檔案
      • 目的地將被來源檔案的內容覆蓋
    • 目的地路徑 存在且是一個目錄
      • 使用 來源路徑 中的基名將檔案複製到此目錄中
  • 來源路徑 指定一個目錄
    • 目的地路徑 不存在
      • 目的地路徑 建立為目錄,並且來源目錄的*內容*會複製到此目錄中
    • 目的地路徑 存在且是一個檔案
      • 錯誤情況:無法將目錄複製到檔案
    • 目的地路徑 存在且是一個目錄
      • 來源路徑 不以 /.(即:*斜線*後跟*點*)結尾
        • 來源目錄會複製到此目錄中
      • 來源路徑/.(即:*斜線*後跟*點*)結尾
        • 來源目錄的*內容*會複製到此目錄中

根據上述規則,該指令要求 來源路徑目的地路徑 存在。如果 來源路徑 是本地的且是符號連結,則預設情況下會複製符號連結,而不是目標。要複製連結目標而不是連結,請指定 -L 選項。

冒號 (:) 用作 容器 與其路徑之間的分隔符號。您也可以在指定本地機器上 來源路徑目的地路徑 的路徑時使用 :,例如 file:name.txt。如果您在本地機器路徑中使用 :,則必須使用相對或絕對路徑明確指定,例如

`/path/to/file:name.txt` or `./file:name.txt`

選項

選項預設值說明
-a, --archive封存模式(複製所有 uid/gid 資訊)
-L, --follow-link始終遵循 SRC_PATH 中的符號連結
-q, --quiet在複製期間隱藏進度輸出。如果未附加終端機,則會自動隱藏進度輸出

範例

將本地檔案複製到容器中

$ docker cp ./some_file CONTAINER:/work

將檔案從容器複製到本地路徑

$ docker cp CONTAINER:/var/logs/ /tmp/app_logs

將檔案從容器複製到 stdout。請注意,cp 指令會產生 tar 串流

$ docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"

特殊情況

無法複製某些系統檔案,例如 /proc/sys/devtmpfs 下的資源,以及使用者在容器中建立的掛載。但是,您仍然可以透過在 docker exec 中手動執行 tar 來複製此類檔案。以下兩個範例以不同的方式執行相同的操作(考慮 來源路徑目的地路徑 是目錄)

$ docker exec CONTAINER tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | tar Cxf DEST_PATH -
$ tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | docker exec -i CONTAINER tar Cxf DEST_PATH -

使用 - 作為 來源路徑 會將 STDIN 的內容作為 tar 封存進行串流。該指令會將 tar 的內容解壓縮到容器檔案系統中的 目的地路徑。在這種情況下,目的地路徑 必須指定一個目錄。使用 - 作為 目的地路徑 會將資源的內容作為 tar 封存串流到 STDOUT