docker container cp

描述在容器和本地檔案系統之間複製檔案/資料夾
用法docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
別名
docker cp

描述

docker cp 工具將 SRC_PATH 的內容複製到 DEST_PATH。你可以從容器的檔案系統複製到本地機器,或者反之,從本地檔案系統複製到容器。如果為 SRC_PATHDEST_PATH 指定 -,你還可以從 STDIN 流式傳輸一個 tar 歸檔,或將 tar 歸檔流式傳輸到 STDOUTCONTAINER 可以是執行中的或已停止的容器。SRC_PATHDEST_PATH 可以是檔案或目錄。

docker cp 命令假定容器路徑是相對於容器的 /(根)目錄的。這意味著開頭的斜槓是可選的;命令將 compassionate_darwin:/tmp/foo/myfile.txtcompassionate_darwin:tmp/foo/myfile.txt 視為相同。本地機器路徑可以是絕對路徑或相對路徑。該命令將本地機器的相對路徑解釋為相對於執行 docker cp 的當前工作目錄。

cp 命令的行為類似於 Unix 的 cp -a 命令,即目錄會遞迴複製,並且儘可能保留許可權。所有權被設定為目標位置的使用者和主組。例如,複製到容器的檔案以根使用者的 UID:GID 建立。複製到本地機器的檔案以呼叫 docker cp 命令的使用者的 UID:GID 建立。但是,如果你指定 -a 選項,docker cp 會將所有權設定為源位置的使用者和主組。如果你指定 -L 選項,docker cp 會跟隨 SRC_PATH 中的任何符號連結。如果 DEST_PATH 的父目錄不存在,docker cp 不會建立它們。

假設路徑分隔符為 /,第一個引數為 SRC_PATH,第二個引數為 DEST_PATH,行為如下:

  • SRC_PATH 指定一個檔案
    • DEST_PATH 不存在
      • 檔案將儲存到在 DEST_PATH 建立的檔案中
    • DEST_PATH 不存在且以 / 結尾
      • 錯誤條件:目標目錄必須存在。
    • DEST_PATH 存在且是一個檔案
      • 目標將被原始檔的內容覆蓋
    • DEST_PATH 存在且是一個目錄
      • 檔案將複製到此目錄中,使用 SRC_PATH 的基本名稱
  • SRC_PATH 指定一個目錄
    • DEST_PATH 不存在
      • DEST_PATH 被建立為一個目錄,源目錄的_內容_被複制到此目錄中
    • DEST_PATH 存在且是一個檔案
      • 錯誤條件:無法將目錄複製到檔案
    • DEST_PATH 存在且是一個目錄
      • SRC_PATH 不以 /. 結尾(即:斜槓後跟點)
        • 源目錄被複制到此目錄中
      • SRC_PATH/. 結尾(即:斜槓後跟點)
        • 源目錄的_內容_被複制到此目錄中

根據上述規則,該命令要求 SRC_PATHDEST_PATH 存在。如果 SRC_PATH 是本地檔案並且是符號連結,則預設複製符號連結本身,而不是目標。要複製連結目標而不是連結,請指定 -L 選項。

冒號(:)用作 CONTAINER 及其路徑之間的分隔符。在指定本地機器上的 SRC_PATHDEST_PATH 時,也可以使用 :,例如 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

將檔案從容器複製到標準輸出。注意 cp 命令生成一個 tar 流

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

特殊情況

不可能複製某些系統檔案,例如 /proc/sys/devtmpfs 下的資源以及使用者在容器中建立的掛載。但是,你仍然可以透過在 docker exec 中手動執行 tar 來複制此類檔案。以下兩個示例以不同的方式執行相同的操作(假設 SRC_PATHDEST_PATH 是目錄)

$ 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 -

使用 - 作為 SRC_PATHSTDIN 的內容作為 tar 歸檔流式傳輸。該命令將 tar 的內容提取到容器檔案系統中的 DEST_PATH。在這種情況下,DEST_PATH 必須指定一個目錄。使用 - 作為 DEST_PATH 將資源的內容作為 tar 歸檔流式傳輸到 STDOUT