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 の基本コマンド |