docker cp¶
使い方¶
$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
補足説明¶
docker cp は SRC_PATH を DEST_PATH にコピーする機能です。コンテナのファイルシステムからローカルマシンにコピーできるだけでなく、逆にローカルのファイルシステムからコンテナへもコピーできます。 SRC_PATH や DEST_PATH にかわり、どちらかに - を指定すると、 STDIN から STDOUT` へ、あるいは、 STDOUT から STDIN へ tar アーカイブとしてストリーミングします。 CONTAINER は、実行中もしくは停止中のコンテナです。 SRC_PATH や DEST_PATH はファイルかディレクトリです。
docker cp コマンドでは、コンテナ内のパスとは、コンテナの / (ルート)ディレクトリからの相対パスとみなします。これが意味するのは、コピー先のパス冒頭にスラッシュを付けるのはオプションです。つまり、コマンド compassionate_darwin:/tmp/foo/myfile.txt と compassionate_darwin:tmp/foo/myfile.txt は同じです。ローカルマシン上のパスは、絶対パスと相対パスどちらも指定できます。ローカルマシン上の相対パスとは、 docker cp を実行した現在の作業ディレクトリからの相対パスです。
cp コマンドの挙動は Unix の cp -a コマンドと似ています。これは、パーミッションを可能であれば維持しながら、ディレクトリを再帰的にコピーします。コピー先でも同じユーザとプライマリ・グループの所有権が設定されます。例えば、コンテナにコピーするファイルは、 root ユーザの UID:GID として作成されます。ローカルマシンへコピーするファイルは、 docker cp コマンドを実行したユーザの UID:GID として作成されます。ですが、 -a オプションを指定する場合、 docker cp はコピー元のユーザとプライマリ・グループの所有権を設定します。 -L オプションを指定する場合は、 docker cp は SRC_PATH ( docker cp は DEST_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_PATH と DEST_PATH は上記のルールに従う必要があります。 SRC_PATH がローカルで、かつ、シンボリックリンクの場合、シンボリックリンクではなくリンク先の実体をコピーします。この動作がデフォルトです。リンク先の対象ではなく、リンクそのものをコピーするには、 -L オプションを指定します。
コロン( : )記号は、 CONTAINER (コンテナ名)とコンテナ内のパスを file:name.txt のように、 : はローカルマシン上で SRC_PATH や DEST_PATH の指定にも使えます。ローカルマシン上のパスで : を使う場合は、次のように相対パスまたは絶対パスで明示する必要があります。
`/path/to/file:name.txt` or `./file:name.txt`
/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 に - を指定すると、tar アーカイブとして STDIN (標準入力)に内容を出力(ストリーミング)します。このコマンドにより、コンテナのファイルシステム上にある DEST_PATH へ tar の内容を展開します。 DEST_PATH に - を指定すると、 tar アーカイブを STDOUT (標準出力)に出力(ストリーミング)します。
オプション¶
名前, 省略形 |
デフォルト |
説明 |
|---|---|---|
|
アーカイブ・モード(全ての uid/gid 情報をコピー) |
|
|
SRC_PATH にあるシンボリックリンクを常にコピー |