docker cp

読む時間の目安: 2 分

説明

ファイルやフォルダーを、コンテナー間あるいはローカルファイルシステムとの間でコピーします。

利用方法

$ docker cp [オプション] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [オプション] SRC_PATH|- CONTAINER:DEST_PATH

追加説明

docker cpSRC_PATHの内容をDEST_PATHにコピーします。 コンテナーのファイルシステムからローカルマシンに、あるいはその逆にローカルシステムからコンテナーにコピーを行います。 SRC_PATHDEST_PATHのどちらかに-を指定すると、tar アーカイブをSTDINから、あるいはSTDOUTへストリーム入出力することができます。 CONTAINERは、実行中、停止中のどちらでもかまいません。 SRC_PATHDEST_PATHはファイルまたはディレクトリを指定します。

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

cpコマンドは Unix のcp -aコマンドのような動作をします。 ディレクトリに対しては再帰的なコピーを行い、可能ならパーミッションをそのまま保持します。 コピー先の所有者は、ユーザーとそのプライマリグループになります。 たとえばファイルコピー先がコンテナーである場合、そのファイルは root ユーザーのUID:GIDになります。 ファイルコピー先がローカルマシンである場合、そのファイルはdocker cpコマンドを実行したユーザーのUID:GIDになります。 ただし-aオプションが指定された場合、docker cpはファイルの所有者を、コピー元のユーザーとそのプライマリグループとします。 -Lオプションが指定された場合、docker cpSRC_PATH内のシンボリックリンクをすべてたどります。 docker cpDEST_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_PATHDEST_PATHが、上記ルールに従って存在している必要があります。 SRC_PATHがローカルにあるシンボリックリンクである場合、コピーされるのはデフォルトではシンボリックリンクそのものであって、そのリンク先ではありません。 シンボリックリンクそのものではなくリンク先をコピーしたい場合は-Lオプションを指定します。

CONTAINERとそのパスとの区切り文字にはコロン(:)が使われます。 またローカルマシン上のSRC_PATHDEST_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/devtmpfs 配下にあるリソース類、あるいはユーザーが生成したマウントは、コピーすることはできません。 もっともdocker execにおいてtarを手動で実行して、そういったファイルをコピーすることはできます。 以下に示す 2 つの例は方法が異なりますが、やっていることは同じです。 (SRC_PATHDEST_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 の基本コマンド