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 にあるシンボリックリンクを常にコピー |
親コマンド¶
コマンド |
説明 |
---|---|
Docker CLI の基本コマンド |