docker cp

説明

コンテナとローカルファイルシステム間で、ファイルやフォルダを コピー(copy) します。

使い方

$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

補足説明

docker cpSRC_PATHDEST_PATH にコピーする機能です。コンテナのファイルシステムからローカルマシンにコピーできるだけでなく、逆にローカルのファイルシステムからコンテナへもコピーできます。 SRC_PATHDEST_PATH にかわり、どちらかに - を指定すると、 STDIN から STDOUT` へ、あるいは、 STDOUT から STDIN へ tar アーカイブとしてストリーミングします。 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コピー元(source) のパス)内にあるシンボリックリンクも維持します。 docker cpDEST_PATHコピー先(destination) のパス)の親ディレクトリが存在しない場合、その親ディレクトリを作成 しません

前提として、パスは / 記号で分けられ、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 (コンテナ名)とコンテナ内のパスを 区切る文字(delimiter) として使います。また、 file:name.txt のように、 : はローカルマシン上で SRC_PATHDEST_PATH の指定にも使えます。ローカルマシン上のパスで : を使う場合は、次のように相対パスまたは絶対パスで明示する必要があります。

`/path/to/file:name.txt` or `./file:name.txt`

/proc/sys/devtmpfs 配下にあるリソースのような、特定のシステムファイルはコピーできません。ですが、 docker exectar を手動で実行すると、コピーできます。以下の例は、異なる手法で同じ処理を行います( 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- を指定すると、tar アーカイブとして STDIN (標準入力)に内容を出力(ストリーミング)します。このコマンドにより、コンテナのファイルシステム上にある DEST_PATH へ tar の内容を展開します。 DEST_PATH- を指定すると、 tar アーカイブを STDOUT (標準出力)に出力(ストリーミング)します。

オプション

名前, 省略形

デフォルト

説明

--archive , -a

アーカイブ・モード(全ての uid/gid 情報をコピー)

--follow-link , -L

SRC_PATH にあるシンボリックリンクを常にコピー

親コマンド

コマンド

説明

docker

Docker CLI の基本コマンド

docker cp

https://docs.docker.com/engine/reference/commandline/cp/