DockerfileのCOPYとADDの違い
1. 序章
Dockerfileを作成する場合、多くの場合、ファイルをホストシステムからDockerイメージに転送する必要があります。 これらは、プロパティファイル、ネイティブライブラリ、またはアプリケーションが実行時に必要とするその他の静的コンテンツである可能性があります。
Dockerfile仕様は、ソースシステムからイメージにファイルをコピーする2つの方法を提供します。COPYおよびADDディレクティブです。
この記事では、それらの違いと、それぞれを使用することが理にかなっている場合について説明します。
2. COPYとADDの違い
一見すると、COPYディレクティブとADDディレクティブは同じように見えます。 それらは同じ構文を持っています:
COPY <source> <destination>
ADD <source> <destination>
そして、両方ともホストシステムからDockerイメージにファイルをコピーします。
では、違いは何ですか? 要するに、ADDディレクティブはCOPYよりも機能が優れています。
機能的には似ていますが、ADDディレクティブは次の2つの点でより強力です。
- リモートURLを処理できます
- tarファイルを自動抽出できます
これらをもっと詳しく見てみましょう。
まず、 ADD ディレクティブは、source引数のリモートURLを受け入れることができます。 一方、 COPY ディレクティブは、ローカルファイルのみを受け入れることができます。
ADDを使用してリモートファイルをフェッチし、コピーすることは通常理想的ではないことに注意してください。 これは、ファイルによってDockerイメージ全体のサイズが大きくなるためです。 代わりに、curlまたはwgetを使用してリモートファイルをフェッチし、不要になったときにそれらを削除する必要があります。
次に、 ADDディレクティブは、tarファイルをイメージファイルシステムに自動的に展開します。 これにより、イメージのビルドに必要なDockerfileステップの数を減らすことができますが、すべての場合に望ましいとは限りません。
自動拡張は、ソースファイルがホストシステムに対してローカルである場合にのみ発生することに注意してください。
3. ADDまたはCOPYを使用する場合
Dockerfileのベストプラクティスガイドによると、ADD の2つの追加機能のいずれかが特に必要な場合を除き、常にADDよりもCOPYを優先する必要があります。
上記のように、 ADD を使用してリモートファイルをDockerイメージにコピーすると、追加のレイヤーが作成され、ファイルサイズが大きくなります。 代わりにwgetまたはcurlを使用すると、後でファイルを削除でき、Dockerイメージの永続的な部分として残りません。
さらに、 ADD コマンドはtarファイルと特定の圧縮形式を自動的に展開するため、予期しないファイルがイメージのファイルシステムに書き込まれる可能性があります。
4. 結論
このクイックチュートリアルでは、ファイルをDockerイメージにコピーする2つの主要な方法であるADDとCOPYについて説明しました。 機能的には似ていますが、ほとんどの場合、COPYディレクティブが推奨されます。 これは、 ADD ディレクティブが、必要な場合にのみ注意して使用する必要がある追加機能を提供するためです。