はじめに
Dockerfileを作成する場合、ファイル/ディレクトリをDockerfileにコピーするために使用できるコマンドが2つあります– ADD
およびCOPY
。それらの機能の範囲にはわずかな違いがありますが、基本的に同じタスクを実行します。
では、なぜ2つのコマンドがあるのでしょうか。また、どちらをいつ使用するかをどのように知るのでしょうか。
この記事では、各コマンドについて説明し、Docker ADDとCOPYを分析して、どちらを使用するかを説明します。
DockerADDコマンド
ADD
に注意することから始めましょう コマンドがCOPY
より古い 。 Dockerプラットフォームのリリース以来、 ADD
命令はコマンドのリストの一部になっています。
このコマンドは、ファイル/ディレクトリを指定されたコンテナのファイルシステムにコピーします。
ADD
の基本的な構文 コマンドは次のとおりです:
ADD <src> … <dest>
コピーするソースが含まれています(
)の後に保存先(
)が続きます )。ソースがディレクトリの場合、 ADD
その中のすべて(ファイルシステムメタデータを含む)をコピーします。
たとえば、ファイルがローカルで利用可能であり、それを画像のディレクトリに追加する場合は、次のように入力します。
ADD /source/file/path /destination/path
追加コード>
URLからファイルをコピーすることもできます。外部ファイルをダウンロードして、目的の宛先にコピーできます。例:
ADD http://source.file/url /destination/path
追加機能は、圧縮ファイルをコピーし、指定された宛先のコンテンツを自動的に抽出することです。この機能は、ローカルに保存された圧縮ファイル/ディレクトリにのみ適用されます。
次のように、ソースと、コマンドでコンテンツを抽出する場所を入力します。
ADD source.file.tar.gz /temp
URLから圧縮ファイル/ディレクトリをダウンロードして抽出することはできないことに注意してください。このコマンドは、外部パッケージをローカルファイルシステムにコピーするときに外部パッケージを解凍しません。
Dockerコピーコマンド
一部の機能の問題により、Dockerはコンテンツを複製するための追加コマンドを導入する必要がありました– COPY
。
密接に関連するADD
とは異なり コマンド、 COPY
割り当てられた機能は1つだけです。その役割は、既存の形式で指定された場所にあるファイル/ディレクトリを複製することです。これは、圧縮ファイルの抽出を処理せず、そのままコピーすることを意味します。
この命令は、ローカルに保存されたファイルにのみ使用できます。したがって、URLとともに使用して、外部ファイルをコンテナにコピーすることはできません。
COPY
を使用するには 指示に従って、基本的なコマンド形式に従ってください:
COPY <src> … <dest>
例:
COPY /source/file/path /destination/path
Dockerコピーと追加
同様の新しいコマンドを追加する必要があったのはなぜですか?
ADD
という事実 非常に多くの機能が実際には問題があることが判明しました。これは、非常に予測できない動作をしたためです。このような信頼性の低いパフォーマンスの結果は、多くの場合、抽出したいときにコピーし、コピーしたいときに抽出することになります。
Dockerは、既存の使用法が多いため、コマンドを完全に置き換えることができませんでした。下位互換性を回避するための最も安全なオプションは、 COPY
を追加することでした。 コマンド–多様性は少ないが、信頼性の高いコマンド。
使用するもの(ベストプラクティス)
COPY
の状況を考慮して コマンドが導入されましたが、ADDを維持することが必要であったことは明らかです。 Dockerは、Dockerfileを作成するためのベストプラクティスを概説した公式ドキュメントをリリースしました。これは、 ADD
の使用を明示的に推奨していません。 コマンド 。
Dockerの公式ドキュメントには、 COPY
ADD
よりも透過的であるため、常にgo-to命令である必要があります 。
ローカルビルドコンテキストからコンテナにコピーする必要がある場合は、 COPY
を使用することに固執します 。
Dockerチームは、 ADD
の使用も強く推奨していません。 URLからパッケージをダウンロードしてコピーします。代わりに、 wgetを使用する方が安全で効率的です またはカール RUN
内 指図。そうすることで、追加の画像レイヤーを作成する必要がなくなり、スペースを節約できます。
URLから圧縮パッケージをダウンロードし、コンテンツを抽出して、アーカイブをクリーンアップするとします。
ADD
を使用する代わりに 次のコマンドを実行します:
ADD http://source.file/package.file.tar.gz /temp
RUN tar -xjf /temp/package.file.tar.gz \
&& make -C /tmp/package.file \
&& rm /tmp/ package.file.tar.gz
使用する必要があります:
RUN curl http://source.file/package.file.tar.gz \
| tar -xjC /tmp/ package.file.tar.gz \
&& make -C /tmp/ package.file.tar.gz