Dockerを初めて使用し、Dockerfileを使用してカスタムDockerイメージを作成する方法を学習しています。
FROM、RUNなどのさまざまなDockerfile命令に出くわします。
次に、COPYとADDに出くわし、両方の命令が同じ仕事をしていることに気付きます。ファイルとディレクトリを、ホストから変更したDockerイメージにコピーします。

Dockerfileに同じタスク用の2つのコマンドがあるのはなぜですか? 2つの間に違いはありますか?それはそう。目標は似ていますが、行動の面では異なります。
説明させてください。
Dockerfile ADD vs COPY
ADDとCOPYはどちらも、Dockerイメージにディレクトリとファイルを追加するように設計されています。
ADD命令は比較的古く、ファイルやディレクトリをコピーするだけで十分です。 ADDは、外部URLからファイルをプルできます。また、アーカイブ形式をサポートしていることを前提として、圧縮ファイルを抽出することもできます。これは、ADDがアーカイブ形式をサポートできなかった場合にも問題を引き起こします。
ADDがこれらすべてを実行できるのなら、なぜCOPYがあるのでしょうか。これは、Dockerコマンドがこれまでに数回再構築されているためです。焦点は、シンプルでわかりやすく、より合理化されたコマンド構造を提供することにあります。
COPYは、ADDの直接的な代替として導入されました。 COPYは、ファイルとディレクトリをコピーするだけです。それでおしまい。ファイルのダウンロードと抽出には、curlやtarなどの通常のLinuxコマンドがRUN命令で使用されます。
これが、最近COPYが推奨されている理由であり、ADDは古いチュートリアルとドキュメントでのみ見つかります。
ADDは、ホストからイメージにファイルをコピーする以外に、ファイルをダウンロードして抽出できる古い命令です。 COPYは、ファイルとディレクトリのみをコピーできます。最近はコピーをお勧めします。ADD命令を詳しく見てください
ADD命令には、次の3つの機能があります。
1。ローカルファイルのコンテナイメージへのコピー
たとえば、ホストシステム上のローカルファイルを/home/user/application
からコピーする場合を考えてみましょう。 /opt/app
に Dockerイメージでは、Dockerfile内に次の命令を含めることができます。
ADD /home/user/application /opt/app
ここでは、/home/user/application
のコンテンツのみ ディレクトリは/opt/app
にコピーされます そのメタデータを含みます。 application
はコピーされません ディレクトリ自体。
2。ローカルに保存されたtarファイルの抽出
ADD命令を使用して、圧縮されたアーカイブを次の形式で抽出することもできます-アイデンティティ 、 gzip 、 bzip2 またはxz 。コンテンツは、ビルドしたDockerイメージの宛先の場所内のディレクトリとして解凍されます。
ADD /home/user/test.tar.gz /opt
動作は、tarコマンドを使用してホストシステムの特定のディレクトリにtarballを抽出した場合と同様です。
3。 URLからファイルをダウンロードする
wget -P
と似ています 動作しますが、Dockerfiles用です。 Dockerイメージのビルド中に、次の手順を使用してファイルをダウンロードし、コンテナーイメージの目的の場所に保存できます。
ADD https://filesamples.com/samples/document/pdf/sample2.pdf /home/user
イメージが作成されたら、それに基づいてコンテナを起動する前に、このPDFドキュメントを作成できます。これは、多くのユニークなユースケースの1つです。
COPY命令
COPY命令は、Dockerユーザー間の混乱を軽減するために設計されたADD命令の進化形です。その機能は1つだけです。ホスト上のソースの場所からDockerイメージ上の宛先の場所にファイルまたはディレクトリをコピーします。
したがって、これは基本的に、上記で説明したADD命令セクションの最初のポイントです。対応する命令は次のようになります:
COPY /home/user/application /opt/app
ベストプラクティスとして、Dockerの開発者は、混乱を避けるために上記の手順を使用することを公式に推奨しています。

したがって、ファイルまたはディレクトリをコピーするだけの場合は、COPY命令のみを使用する必要があります。可能な限り、ADDの使用は避けてください。ファイルのダウンロードと抽出には、通常のLinuxコマンドでRUN命令を使用します。
これで、2つの手順の基本的な違いを理解できることを願っています。それらを個別に理解するために、ADDとCOPYの公式で完全なリファレンスを見ることができます。
上記の比較について共有する提案、フィードバック、またはコメントがある場合は、以下のセクションにご意見をお寄せください。