cp¶
使い方: docker cp [オプション] コンテナ:パス ローカル・パス|-
docker cp [オプション] ローカル・パス|- コンテナ:パス
コンテナとローカル・ファイルシステム間でファイルとフォルダをコピーする
--help 使い方の表示
概要の1つめは、 コンテナ
のファイルシステム上の パス
にある内容を ローカルのパス
にコピーするために、 docker cp
が役立ちます。
概要の2つめは、 ローカルパス
(あるいは STDIN
で -
で指定した tar アーカイブを流し込み)に含まれる内容を、ローカルマシン上から コンテナ
のファイルシステム上の パス
にコピーします。
コピーはコンテナが実行中でも停止中でも可能です。 パス
とはファイルまたはディレクトリです。 docker cp
コマンドは、全ての コンテナ:パス
値をコンテナ内の /
(ルート)ディレクトリとみなします。つまり、転送先の冒頭にスラッシュを付けるのはオプションです。つまり、コマンド compassionate_darwin:/tmp/foo/myfile.txt
と compassionate_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
、 /dev
、 tmpfs 配下にあるリソースのように、特定のシステムファイルはコピーできません。これらはコンテナの中にマウントします。ただし、 docker exec
で tar
を時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
(標準出力)にストリーム出力します。