GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerCpを使用してホストとコンテナー間でファイルをコピーする方法

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ボリュームを使用する必要があります。ボリュームを使用すると、データを単一のコンテナよりも長持ちさせることができるため、手動で docker cpする必要はありません。 インスタンスを置き換える前。バックアップを作成するときは、コンテナからファイルを引き出すのではなく、ホストからボリュームをコピーします。

docker cp コンテナをデバッグするとき、または開発環境で作業するときに最も役立ちます。一時的な構成ファイルを手動で挿入したり、埋め込まれたログを引き出したりする必要がある場合があります。 docker cpを使用する コードを変更するたびにイメージ全体を再構築するよりも迅速で便利です。

コピーされたファイルを常に覚えておいてください コンテナは、コンテナが存続している間だけ存続します。同じイメージから別のコンテナーを開始すると、 docker cp で追加したファイルがなくても、きれいな状態になります。 。

概要

docker cp ホストとDockerコンテナ間でファイルを移動できます。ファイルとディレクトリで機能しますが、シェルベースの cpの高度な機能のほとんどが欠けています。 コマンド。

docker cpの定期的な使用 コンテナのベストプラクティスからの逸脱の可能性を示します。コンテナでの作業に不可欠な部分ではなく、開発用の便利なツールとして扱うのが賢明です。長期的なファイルの永続性は、Dockerエコシステムのファーストクラスのコンポーネントであるボリュームを使用して実装する必要があります。


Docker
  1. podmanとdockerの違い。

  2. Dockerイメージ、コンテナー、およびDockerファイルを詳細に使用する方法

  3. Dockerコンテナ間でデータを共有する方法

  1. DockerComposeの使用方法

  2. リモートDockerホストを使用する方法と理由

  3. Kubernetesポッドとマシン間でファイルをコピーする方法

  1. Dockerコンテナを一覧表示する方法

  2. Docker コンテナーをバックアップおよび復元する方法

  3. Docker コンテナを一時停止および再開する方法