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 からの、あるいは STDOUT への tar アーカイブを扱うことになります。
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 はルートユーザーのものになります。
ローカルマシンにコピーされたファイルの UID:GID は docker cp を実行したユーザーのものになります。
ただし docker cp に -a オプションをつけた場合の所有者は、コピー元のユーザーおよびプライマリグループとなります。
-L オプションをつけた場合 docker cp は SRC_PATH 内のシンボリックリンクをすべてたどります。
docker cp の DEST_PATH が存在しなかった場合、そのディレクトリは生成されません。
パスセパレーター /、第一引数 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` または `./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 を実行させれば、そのようなファイルであってもコピーが可能です。
以下に示す例は同じ処理内容を、異なる方法によって実現するものです。
(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 に出力します。