docker cp
読む時間の目安: 2 分
説明
ファイルやフォルダーを、コンテナー間あるいはローカルファイルシステムとの間でコピーします。
利用方法
$ docker cp [オプション] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [オプション] SRC_PATH|- CONTAINER:DEST_PATH
追加説明
docker cpはSRC_PATHの内容をDEST_PATHにコピーします。
コンテナーのファイルシステムからローカルマシンに、あるいはその逆にローカルシステムからコンテナーにコピーを行います。
SRC_PATHとDEST_PATHのどちらかに-を指定すると、tar アーカイブをSTDINから、あるいは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コマンドのような動作をします。
ディレクトリに対しては再帰的なコピーを行い、可能ならパーミッションをそのまま保持します。
コピー先の所有者は、ユーザーとそのプライマリグループになります。
たとえばファイルコピー先がコンテナーである場合、そのファイルは root ユーザーのUID:GIDになります。
ファイルコピー先がローカルマシンである場合、そのファイルはdocker cpコマンドを実行したユーザーのUID:GIDになります。
ただし-aオプションが指定された場合、docker cpはファイルの所有者を、コピー元のユーザーとそのプライマリグループとします。
-Lオプションが指定された場合、docker cpはSRC_PATH内のシンボリックリンクをすべてたどります。
docker cpはDEST_PATHの親ディレクトリが存在しない場合、そのディレクトリを生成 しません。
パスセパレーター文字を/、第 1 引数をSRC_PATH、第 2 引数を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` または `./file:name.txt`
本コマンドの利用例については、以下に示す 利用例の節 を参照してください。
オプション
| 名前/省略形 | デフォルト | 説明 |
--archive , -a |
アーカイブモード。(uid/gid 情報をすべてコピーします。) | |
--follow-link , -L |
SRC_PATH 内のシンボリックリンクは常にたどります。 |
利用例
Copy a local file into container
$ docker cp ./some_file CONTAINER:/work
Copy files from container to local path
$ docker cp CONTAINER:/var/logs/ /tmp/app_logs
Copy a file from container to stdout. Please note cp command produces a tar stream
$ docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"
Corner cases
システムファイルとして/proc、/sys、/dev、tmpfs 配下にあるリソース類、あるいはユーザーが生成したマウントは、コピーすることはできません。
もっともdocker execにおいてtarを手動で実行して、そういったファイルをコピーすることはできます。
以下に示す 2 つの例は方法が異なりますが、やっていることは同じです。
(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に出力します。
上位コマンド
| コマンド | 説明 |
|---|---|
| docker | Docker CLI の基本コマンド |