Dockerコンテナにファイルを出し入れする必要がありますか? docker cp
コマンドを使用すると、ホストファイルシステムとコンテナファイルシステム間でコピーできるため、構成の詳細を追加したり、バックアップを作成したり、既存のデータを復元したりできます。
docker cp
ソースパスと宛先パスを2つの引数として受け入れます:
docker cp example.txt my-container:/example.txt
ここでexample.txt
作業ディレクトリから/example.txt
にコピーされています my-container
内 容器。 2つの引数を逆にして、 /example.txt
をコピーできます。 コンテナから作業ディレクトリに移動します。
コンテナパスを参照する引数の前には、コンテナIDまたは名前の後にコロン(:
)を付ける必要があります。 )。実行中のコンテナのIDまたは名前はdockerps
で見つけることができます 。
各dockercp
コマンドには、1つのローカルファイルシステムパスと1つのコンテナパスが必要です。2つのコンテナ間で直接コピーすることはできません。これを行う必要がある場合は、最初にソースコンテナからファイルシステムにコピーし、次に新しいローカルパスからターゲットコンテナにコピーするという、マルチステップの手順を使用します。
docker cp
ディレクトリも再帰的にコピーできます:
docker cp /home/demo/website apache-container:/var/www/html/.
Dockerは、 / home / demo / website
内のすべてをコピーします それを/var / www / html
に転送します 。
ファイルをコピーするときに、Dockerがコピー先に新しいファイルを作成します(まだ存在しない場合)。既存のファイルは新しいコンテンツで上書きされます。宛先がディレクトリの場合、ファイルはソースファイル名を使用してそのディレクトリにコピーされます。例外は、指定された宛先が /
で終わる場合です。 、ディレクトリを示しますが、パスはまだ存在していません。このシナリオでは、エラーが発生します。
ディレクトリコピーの場合、プロセスはもう少し複雑です。宛先パスがまだ存在しない場合は、ソースディレクトリの内容を使用して宛先に新しいディレクトリが作成されます。存在する場合、末尾に/。
を含めたかどうかによって動作が異なります。 パス内のコンポーネント。
-
/。
存在する–ソースディレクトリ 既存の宛先ディレクトリにコピーされます。 -
/。
存在しない–コンテンツ ソースディレクトリの一部が宛先にコピーされます。
微妙な違いにより、宛先内に新しいサブディレクトリが作成されるかどうかが決まります。
その名前にもかかわらず、 docker cp
cp
の完全な実装ではありません シェルコマンド。 cp
-a
を除いて、フラグはサポートされていません および-L
:
-
-a
–アーカイブモード。コピーされたファイルのユーザーとグループの詳細を保持します。 -
-L
–リンク自体ではなく、ソースディレクトリのシンボリックリンクをたどって、リンクターゲットのコンテンツをコピーします。
選択的なコピーが必要なより高度なユースケースでは、別のアプローチを使用するようにフォールバックする必要があります。
Dockerボリュームは、コンテナーとホスト間でファイルを移動する別の方法を提供します。ローカルディレクトリをコンテナにバインドマウントすると、ホストファイルシステムからそのコンテンツにアクセスできるため、 docker cp
を使用する必要がなくなります。 。
docker run -v /example/host/directory:/container/path my-image:latest
/ example / host / directory
の内容 パスは、コンテナのファイルシステムの / container / path
にマウントされます。 。 cp
などの使い慣れたツールを使用して、Dockerの外部でこれらのファイルを操作できます。 、 rsync
、およびグラフィカルファイルブラウザ。
この手法は、単一のコンテナディレクトリで作業している場合にのみ役立ちます。任意の場所からコピーする場合は、コンテナの作成時に使用するパスを事前に知っておく必要があるため、うまく機能しません。
また、ファイルシステムのアクセス許可にも注意する必要があります。コンテナ内で作成されたファイルは通常、 root
によって所有されます。 。これにより、バインドされたディレクトリ内のファイルを編集または削除できないホスト上で厄介なシナリオが作成される可能性があります。 chown
を使用する 必要に応じて、環境に応じて所有権を切り替えるために、ホストとコンテナ内でコマンドを実行します。
COPY
について Dockerfilesで?
docker cp
COPY
と混同されることがあります Dockerfilesの命令。これら2つの機能は非常に異なるユースケースを提供することを認識することが重要です。
コピーコード> ホストと実行中のコンテナ間でファイルを移動するために使用することはできません。ファイルを画像に取り込むためのものです ビルドプロセス中:
COPY /home/me/my-website /var/www/html/.
ここでは、Webサイトのソースコードがビルドの一部としてイメージにコピーされます。これは1回限りのプロセスです。イメージから開始されたすべてのコンテナには、 docker build
を実行したときのWebサイトソースが含まれます。 。
docker cp
コンテナが実行されたら、そのソースコードを新しいバージョンに置き換えることができます。 コピーコード> 手順は、ファイルを静止画像の一部にするためのものです。
cp
コマンドはライブコンテナと相互作用します。
ホストからDockerコンテナに、またはその逆にファイルを手動でコピーすることは、比較的まれなことです。画像は自給自足であることが意図されているため、インスタンスを開始するために必要なすべてのものが付属している必要があります。構成は通常、環境変数を介して処理されます。
データを永続的に保存する必要があるコンテナーは、Dockerボリュームを使用する必要があります。ボリュームを使用すると、データを単一のコンテナよりも長持ちさせることができるため、手動で docker cp
する必要はありません。 インスタンスを置き換える前。バックアップを作成するときは、コンテナからファイルを引き出すのではなく、ホストからボリュームをコピーします。
docker cp
コンテナをデバッグするとき、または開発環境で作業するときに最も役立ちます。一時的な構成ファイルを手動で挿入したり、埋め込まれたログを引き出したりする必要がある場合があります。 docker cp
を使用する コードを変更するたびにイメージ全体を再構築するよりも迅速で便利です。
にコピーされたファイルを常に覚えておいてください コンテナは、コンテナが存続している間だけ存続します。同じイメージから別のコンテナーを開始すると、 docker cp
で追加したファイルがなくても、きれいな状態になります。 。
docker cp
ホストとDockerコンテナ間でファイルを移動できます。ファイルとディレクトリで機能しますが、シェルベースの cp
の高度な機能のほとんどが欠けています。 コマンド。
docker cp
の定期的な使用 コンテナのベストプラクティスからの逸脱の可能性を示します。コンテナでの作業に不可欠な部分ではなく、開発用の便利なツールとして扱うのが賢明です。長期的なファイルの永続性は、Dockerエコシステムのファーストクラスのコンポーネントであるボリュームを使用して実装する必要があります。