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_PATH
或 DEST_PATH
指定 -
,你還可以從 STDIN
流式傳輸一個 tar 歸檔,或將 tar 歸檔流式傳輸到 STDOUT
。CONTAINER
可以是執行中的或已停止的容器。SRC_PATH
或 DEST_PATH
可以是檔案或目錄。
docker cp
命令假定容器路徑是相對於容器的 /
(根)目錄的。這意味著開頭的斜槓是可選的;命令將 compassionate_darwin:/tmp/foo/myfile.txt
和 compassionate_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_PATH
和 DEST_PATH
存在。如果 SRC_PATH
是本地檔案並且是符號連結,則預設複製符號連結本身,而不是目標。要複製連結目標而不是連結,請指定 -L
選項。
冒號(:
)用作 CONTAINER
及其路徑之間的分隔符。在指定本地機器上的 SRC_PATH
或 DEST_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
、/dev
、tmpfs 下的資源以及使用者在容器中建立的掛載。但是,你仍然可以透過在 docker exec
中手動執行 tar
來複制此類檔案。以下兩個示例以不同的方式執行相同的操作(假設 SRC_PATH
和 DEST_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_PATH
將 STDIN
的內容作為 tar 歸檔流式傳輸。該命令將 tar 的內容提取到容器檔案系統中的 DEST_PATH
。在這種情況下,DEST_PATH
必須指定一個目錄。使用 -
作為 DEST_PATH
將資源的內容作為 tar 歸檔流式傳輸到 STDOUT
。