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。