Dockerfileの'COPY'と'ADD'コマンドの違いは何ですか?

docker dockerfile


Dockerfileの COPY コマンドと ADD コマンドの違いは何ですか?また、いつどちらを使用するのですか?

COPY <src> <dest>

COPY命令は、 <src> から新しいファイルをコピーし、パス <dest> にあるコンテナーのファイルシステムに追加します。

ADD <src> <dest>

ADD命令は、 <src> から新しいファイルをコピーし、パス <dest> にあるコンテナーのファイルシステムに追加します。




Answer 1 icecrime


動作の詳細については、 ADD COPYドキュメントを確認する必要がありますが、簡単に言うと、 ADDCOPY よりも多くのことができるという点が大きく異なります。

  • ADD では <src> をURLにすることができます
  • 以下のコメントを参照して、 ADD ドキュメントは次のように述べています。

    認識された圧縮形式 (identity、gzip、bzip2、または xz)のローカル tar アーカイブの場合は、ディレクトリとして展開されます。リモート URL からのリソースは解凍されません。

Dockerfileを作成するためのベストプラクティスでは、 ADD のマジックが不要な場合は COPY を使用することをお勧めします。そうでない場合、 keep_this_archive_intact.tar.gz をコンテナーにコピーするつもりで(この回答を調べる必要があったため)いつか驚かれる可能性がありますが、代わりにコンテンツをファイルシステムにスプレーします。




Answer 2 caike


COPY

ADD' と同じですが、tar とリモート URL の扱いがありません。

ソースコードから直接参照。




Answer 3 Victor Laskin


その点に関していくつかの公式ドキュメントがあります:Dockerfilesを書くためのベストプラクティス

画像のサイズが重要であるため、リモートURLからパッケージをフェッチするために ADD を使用することは強くお勧めしません。代わりに curl または wget を使用してください。これにより、抽出後に不要になったファイルを削除でき、画像にレイヤーを追加する必要がなくなります。

RUN mkdir -p /usr/src/things \
  && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
  && make -C /usr/src/things all

ADD のtar自動抽出機能を必要としない他のアイテム(ファイル、ディレクトリ)の場合は、常に COPY を使用する必要があります。




Answer 4 eddd


Dockerのドキュメントより。

追加またはコピー

ADDとCOPYは機能的に類似していますが、一般的に言えば、COPYが推奨されます。これは、ADDよりも透過的であるためです。COPYは、ローカルファイルのコンテナーへの基本的なコピーのみをサポートしますが、ADDには、すぐには明らかにならない機能(ローカルのみのtar抽出やリモートURLサポートなど)があります。したがって、ADD rootfs.tar.xz /のように、ADDの最適な使用法は、イメージへのローカルtarファイルの自動抽出です。

詳細:Dockerfileを作成するためのベストプラクティス




Answer 5 BertLi


xx.tar.gzをコンテナー内の /usr/local に追加する場合は、それを解凍して、不要な圧縮パッケージを削除します。

COPYのために。

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

ADDのために

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

ADDはローカルのみのtar抽出をサポートしています。それに加えて、COPYは3つのレイヤーを使用しますが、ADDは1つのレイヤーしか使用しません。