docker container cp
說明 | 在容器和本地檔案系統之間複製檔案/資料夾 |
---|---|
用法 | docker container cp [選項] 容器:來源路徑 目的路徑|- docker cp [選項] 來源路徑|- 容器:目的地路徑 |
別名 | docker cp |
說明
docker cp
工具會將 來源路徑
的內容複製到 目的地路徑
。您可以從容器的檔案系統複製到本地機器,反之亦然,從本地檔案系統複製到容器。如果為 來源路徑
或 目的地路徑
指定 -
,您也可以從 STDIN
串流 tar 封存或到 STDOUT
。容器
可以是正在執行或已停止的容器。來源路徑
或 目的地路徑
可以是檔案或目錄。
docker cp
指令假設容器路徑相對於容器的 /
(根)目錄。這表示提供初始正斜線是可選的;該指令將 compassionate_darwin:/tmp/foo/myfile.txt
和 compassionate_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
、/dev
、tmpfs 下的資源,以及使用者在容器中建立的掛載。但是,您仍然可以透過在 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
。