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_PATHDEST_PATH- が指定された場合、STDIN からの、あるいは STDOUT への tar アーカイブを扱うことになります。 CONTAINER に指定するコンテナーは実行中、停止中のいずれも可能です。 SRC_PATH または DEST_PATH はファイルあるいはディレクトリとすることができます。

docker cp コマンドに指定されるコンテナーパスは、コンテナーの / (ルート) ディレクトリからの相対パスであるものとして扱います。 これはつまりパスの先頭にスラッシュをつけるかどうかは任意です。 compassionate_darwin:/tmp/foo/myfile.txtcompassionate_darwin:tmp/foo/myfile.txt は同一に扱われます。 ローカルマシン側のパスは、絶対パス、相対パス両方の指定が可能です。 ローカルマシンの相対パスは、docker cp が実行されたワーキングディレクトリからの相対パスとして解釈されます。

cp コマンドは Unix の cp -a コマンドと同じような動作をします。 つまりディレクトリは再帰的にコピーされ、パーミッションは可能な限り維持されます。 所有者はコピー先ディレクトリのユーザーとプライマリグループに設定されます。 たとえばコンテナーにコピーされたファイルの UID:GID はルートユーザーのものになります。 ローカルマシンにコピーされたファイルの UID:GIDdocker cp を実行したユーザーのものになります。 ただし docker cp-a オプションをつけた場合の所有者は、コピー元のユーザーおよびプライマリグループとなります。 -L オプションをつけた場合 docker cpSRC_PATH 内のシンボリックリンクをすべてたどります。 docker cpDEST_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_PATHDEST_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-linkSRC_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 に出力します。