Frage Was ist der Unterschied zwischen den Befehlen "COPY" und "ADD" in einer Dockerfile?


Was ist der Unterschied zwischen den? COPY und ADD Befehle in einer Dockerfile, und wann würde ich einen über den anderen verwenden?


COPY <src> <dest>

Die COPY-Anweisung kopiert neue Dateien von <src> und füge sie hinzu   Das Dateisystem des Containers im Pfad <dest>


ADD <src> <dest>

Die ADD-Anweisung kopiert neue Dateien von <src> und füge sie dem hinzu   Dateisystem des Containers im Pfad <dest>.


1483
2017-07-25 14:31


Ursprung


Antworten:


Du solltest das überprüfen ADD und COPY Dokumentation für eine erschöpfende Beschreibung ihres Verhaltens, aber auf den Punkt gebracht ist der Hauptunterschied, dass ADD kann mehr als COPY:

  • ADD erlaubt <src> eine URL sein
  • Wenn die <src> Parameter von ADD ist ein Archiv in einem anerkannten Kompressionsformat, wird es entpackt

Notiere dass der Best Practices zum Schreiben von Dockerfiles schlägt vor zu verwenden COPY wo die Magie von ADD ist nicht nötig. Sonst wirst du (da du diese Antwort nachschlagen musst) wahrscheinlich eines Tages überrascht sein, wenn du es kopieren willst keep_this_archive_intact.tar.gz in Ihren Container, sondern sprühen Sie den Inhalt auf Ihr Dateisystem.


1482
2017-07-25 14:52



COPY ist

Das gleiche wie "ADD", aber ohne die tar und remote URL-Behandlung.

Referenz direkt aus dem Quellcode.


294
2017-09-30 16:13



Es gibt einige offizielle Dokumente zu diesem Punkt: Best Practices für das Schreiben von Dockerfiles 

Da Bildgröße wichtig ist, verwenden Sie ADD Es wird dringend davon abgeraten, Pakete von Remote-URLs abzurufen. du solltest benutzen curl oder wget stattdessen. Auf diese Weise können Sie die Dateien löschen, die Sie nach dem Extrahieren nicht mehr benötigen, und Sie müssen keine weitere Ebene in Ihrem Bild hinzufügen.

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

Für andere Elemente (Dateien, Verzeichnisse), die nicht benötigt werden ADDTar-Auto-Extraktion-Fähigkeit, sollten Sie immer verwenden COPY.


116
2017-10-02 08:21



Aus Docker-Dokumenten:

HINZUFÜGEN oder KOPIEREN

Obwohl ADD und COPY funktional ähnlich sind, wird COPY im Allgemeinen bevorzugt. Das liegt daran, dass es transparenter als ADD ist. COPY unterstützt nur das grundlegende Kopieren von lokalen Dateien in den Container, während ADD einige Funktionen (wie nur lokale Teer-Extraktion und Remote-URL-Unterstützung) bietet, die nicht sofort offensichtlich sind. Folglich ist die beste Verwendung für ADD die lokale TAR-Datei-automatische Extraktion in das Bild, wie in ADD rootfs.tar.xz /.

Mehr: Best Practices zum Schreiben von Dockerfiles


95
2017-08-10 15:19



Wenn Sie ein xx.tar.gz zu einem hinzufügen möchten /usr/local Entpacken Sie es im Container, und entfernen Sie das unbrauchbare komprimierte Paket.

Für 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

Für ADD:

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

ADD unterstützt nur lokale Teer-Extraktion. Außerdem verwendet COPY drei Ebenen, ADD jedoch nur eine Ebene.


26
2018-04-25 07:07



Aus Docker-Dokumenten: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

"Obwohl ADD und COPY funktional ähnlich sind, wird COPY im Allgemeinen bevorzugt. Das liegt daran, dass es transparenter als ADD ist. COPY unterstützt nur das einfache Kopieren lokaler Dateien in den Container, während ADD einige Funktionen (wie nur lokale Teer-Extraktion und Remote-URL-Unterstützung), die nicht unmittelbar offensichtlich sind. Daher ist die beste automatische Verwendung für ADD die automatische Extraktion von lokalen TAR-Dateien in das Image, wie in ADD rootfs.tar.xz /.

Wenn Sie mehrere Dockerfile-Schritte haben, die verschiedene Dateien aus Ihrem Kontext verwenden, kopieren Sie sie einzeln und nicht auf einmal. Dadurch wird sichergestellt, dass der Build-Cache jedes Schritts nur ungültig gemacht wird (erzwingt, dass der Schritt erneut ausgeführt wird), wenn sich die speziell benötigten Dateien ändern.

Beispielsweise:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

Dies führt zu weniger Cache-Invalidierungen für den RUN-Schritt, als wenn Sie COPY setzen. / tmp / davor.

Da Bildgröße wichtig ist, wird dringend davon abgeraten, mit ADD Pakete von Remote-URLs abzurufen. Sie sollten stattdessen curl oder wget verwenden. Auf diese Weise können Sie die Dateien löschen, die Sie nach dem Extrahieren nicht mehr benötigen, und Sie müssen keine weitere Ebene in Ihrem Bild hinzufügen. Sie sollten beispielsweise Folgendes vermeiden:

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

Und stattdessen etwas tun wie:

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

Für andere Objekte (Dateien, Verzeichnisse), die nicht die automatische Extraktionsfunktion von ADD benötigen, sollten Sie immer COPY verwenden. "


11
2018-06-12 05:29



Wichtige Notiz

Ich musste Java-Paket in meinem Dockerbild kopieren und entpacken. Wenn ich die mit ADD erstellte Docker-Bildgröße verglich, war sie 180 MB größer als die mit COPY, tar -xzf * .tar.gz und rm * .tar.gz erstellte

Das heißt, obwohl ADD die TAR-Datei entfernt, wird sie trotzdem irgendwo gespeichert. Und es macht das Bild groß !!


0
2018-06-07 08:00



COPY kopiert eine Datei / ein Verzeichnis von Ihrem Host in Ihr Image.

ADD Kopiert eine Datei / ein Verzeichnis von Ihrem Host in Ihr Image, kann aber auch entfernte URLs abrufen, TAR-Dateien extrahieren usw.

Benutzen COPY zum einfachen Kopieren von Dateien und / oder Verzeichnissen in den Build-Kontext.

Benutzen ADD zum Herunterladen von Remote-Ressourcen, Extrahieren von TAR-Dateien, etc ..


0
2018-05-31 12:11



docker build -t {image name} -v {host directory}:{temp build directory} .

Dies ist eine andere Möglichkeit, Dateien in ein Bild zu kopieren. Die Option -v erstellt vorübergehend ein Volume, das wir während des Erstellungsprozesses verwendet haben.

Dies ist anders als bei anderen Volumes, da nur ein Hostverzeichnis für den Build bereitgestellt wird. Dateien können mit einem Standard-CP-Befehl kopiert werden.

Ebenso wie curl und wget kann es in einem Befehlsstapel (der in einem einzelnen Container ausgeführt wird) ausgeführt werden und die Bildgröße nicht multiplizieren. HINZUFÜGEN und KOPIEREN sind nicht stapelbar, da sie in einem eigenständigen Container ausgeführt werden und nachfolgende Befehle für die Dateien, die in zusätzlichen Containern ausgeführt werden, multiplizieren die Bildgröße:

Mit den so eingestellten Optionen:

-v /opt/mysql-staging:/tvol

Folgendes wird in einem Container ausgeführt:

RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \
    mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \

    mkdir /u1/mysql/mysql-files && \
    mkdir /u1/mysql/innodb && \
    mkdir /u1/mysql/innodb/libdata && \
    mkdir /u1/mysql/innodb/innologs && \
    mkdir /u1/mysql/tmp && \

    chmod 750 /u1/mysql/mysql-files && \
    chown -R mysql /u1/mysql && \
    chgrp -R mysql /u1/mysql

-1
2017-09-23 19:32