cp

使い方: docker cp [オプション] コンテナ:パス ローカル・パス|-
       docker cp [オプション] ローカル・パス|- コンテナ:パス

コンテナとローカル・ファイルシステム間でファイルとフォルダをコピーする

  --help              使い方の表示

概要の1つめは、 コンテナ のファイルシステム上の パス にある内容を ローカルのパス にコピーするために、 docker cp が役立ちます。

概要の2つめは、 ローカルパス (あるいは STDIN- で指定した tar アーカイブを流し込み)に含まれる内容を、ローカルマシン上から コンテナ のファイルシステム上の パス にコピーします。

コピーはコンテナが実行中でも停止中でも可能です。 パス とはファイルまたはディレクトリです。 docker cp コマンドは、全ての コンテナ:パス 値をコンテナ内の / (ルート)ディレクトリとみなします。つまり、転送先の冒頭にスラッシュを付けるのはオプションです。つまり、コマンド compassionate_darwin:/tmp/foo/myfile.txtcompassionate_darwin:tmp/foo/myfile.txt は同一です。 ローカルパス の値は絶対パスではなく、現在の作業ディレクトリからの相対パスとみなされます。

動作は一般的な Unix ユーティリティ cp -a に似ています。可能であればパーミッションと一緒に、ディレクトリも再帰的にコピーします。所有者の権限は、転送終了時にユーザとプライマリ・グループが指定されます。例えば、ファイルをコンテナにコピーすると、 UID:GID は root ユーザとして作成されます。ファイルをローカルのマシン上にコピーする時は、 docker cp コマンドを実行したユーザの UID:GID が作成されます。もしも docker cp-L オプションを指定すると、 送信元パス のシンボリック・リンクをフォローします。 docker cp送信先パス が存在しなければ、親ディレクトリを作成しません。

パスは / で分離され、 1つめの引数は 送信元のパス 、2つめの引数は 送信先のパス とみなされます。次のように動作します。

  • 送信元のパス でファイルを指定する
  • 送信先のパス が存在しない
  • 送信先のパス にファイルを作成し、ファイルを保存する
  • 送信先のパス が存在せず、最後に / がある場合
  • エラーが発生:送信先ディレクトリが存在しなくてはいけない
  • 送信先のパス が存在し、ファイルである場合
  • 送信元にあるファイルで、送信先のファイル内容を上書きする
  • 送信先のパス が存在し、ディレクトリの場合
  • 送信元のパス にある名前をもとに、対象のディレクトリにファイルをコピー
  • 送信元のパス でディレクトリを指定する
  • 送信先のパス が存在しない
  • 送信先のパス にディレクトリを作成し、送信元ディレクトリに含まれる 内容 をコピーする
  • 送信先のパス が存在し、ファイルである場合
  • エラーが発生:ディレクトリをファイルにコピーできない
  • 送信先のパス が存在し、ディレクトリの場合
  • 送信元のパス/ で終わる場合
  • 送信元ディレクトリ を対象のディレクトリにコピー
  • 送信元のパス/ で終わらない場合
  • 送信元ディレクトリ内容 を対象のディレクトリにコピー

コマンドで使う 送信元のパス送信先のパス は上記のルールに従う必要があります。 送信元のパス がローカル上かつシンボリックリンクの場合は、その対象ではなくシンボリックリンクがコピーされます。

コロン( : )は コンテナパス のデリミタ(区切り文字)として使われますが、 :file:name.txt のように有効な ローカルのパス としても使われます。この曖昧さを解決するには、 ローカルパス: を明確な絶対パス・相対パスの指定に使います。例:

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

/proc/sys/devtmpfs 配下にあるリソースのように、特定のシステムファイルはコピーできません。これらはコンテナの中にマウントします。ただし、 docker exectar を時h手動実行し、ファイルをコピー可能です。例( 送信元のパス送信先のパス はディレクトリと見なします):

$ docker exec foo tar Ccf $(dirname 送信元パス) - $(basename 送信元パス) | tar Cxf 送信先パス -

あるいは

$ tar Ccf $(dirname 送信元パス) - $(basename 送信元パス) | docker exec -i foo tar Cxf 送信先パス -

送信元のパス- を使うと、 STDIN (標準入力)を tar アーカイブの内容として流し込みます。このコマンドにより、対象となるコンテナ上にあるファイルシステムの 送信先パス に展開します。この場合、 送信先パス にはディレクトリを指定する必要があります。 送信先パス- を使うと、tar アーカイブを STDOUT (標準出力)します。

ローカルパス の1番めの引数に - を使うと、tar アーカイブからの内容を STDIN (標準入力)としてストリーム(流し込み)ます。これにより、対象となるコンテナのファイルシステムにある パス に展開します。元となるコンテナのリソースに含まれる内容が、tar アーカイブとして STDOUT (標準出力)にストリーム出力します。