Was ist der Unterschied zwischen den Befehlen COPY
und ADD
in einer Docker-Datei und wann würde ich einen über den anderen verwenden?
COPY <src> <dest>
Die COPY-Anweisung kopiert neue Dateien aus
<src>
und fügt sie dem Dateisystem des Containers unter Pfad hinzu<dest>
ADD <src> <dest>
Die ADD-Anweisung kopiert neue Dateien aus
<src>
und fügt sie dem Dateisystem des Containers unter Pfad hinzu<dest>
.
docker
dockerfile
Steve
quelle
quelle
COPY
bei jeder Ausführung auszuführen, da es nicht unbedingt Zugriff auf den ursprünglichen Kontext hat, um den Inhalt abzurufen.Antworten:
Sie sollten die Dokumentation
ADD
und dieCOPY
Dokumentation überprüfen, um eine detailliertere Beschreibung ihres Verhaltens zu erhalten. Kurz gesagt, der Hauptunterschied besteht darin, dassADD
mehr möglich ist alsCOPY
:ADD
erlaubt<src>
eine URL zu seinADD
Dokumentation :Beachten Sie, dass die Best Practices für das Schreiben von Docker-Dateien die Verwendung
COPY
dort empfehlen , wo die Magie vonADD
nicht erforderlich ist. Andernfalls werden Sie ( da Sie diese Antwort nachschlagen mussten ) wahrscheinlich eines Tages überrascht sein, wenn Siekeep_this_archive_intact.tar.gz
in Ihren Container kopieren möchten. Stattdessen sprühen Sie den Inhalt auf Ihr Dateisystem.quelle
If <src> is a local tar archive in a recognized compression format (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources from remote URLs are not decompressed.
COPY
istReferenz direkt aus dem Quellcode .
quelle
ADD
auch schafft nicht vorhandene Verzeichnisse . Also, obwohl es in diesem ganzen Thread irgendwie entmutigt ist, hat es einen Vorteil gegenüber,COPY
weil Sie nicht laufenmkdir
und einige Eingaben speichern müssenZu diesem Punkt gibt es einige offizielle Dokumentationen: Best Practices für das Schreiben von Docker-Dateien
quelle
COPY
, weil es transparenter ist. Aus den Best Practices der Docker-Datei (15.12.2014):Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features that are not immediately obvious.
Aus Docker-Dokumenten:
Mehr: Best Practices zum Schreiben von Dockerfiles
quelle
Wenn Sie einem
/usr/local
In-Container eine xx.tar.gz hinzufügen möchten , entpacken Sie diese und entfernen Sie das unbrauchbare komprimierte Paket.Für KOPIE:
Für ADD:
ADD unterstützt die lokale Teerextraktion. Außerdem verwendet COPY drei Ebenen, ADD jedoch nur eine Ebene.
quelle
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local && rm /tmp/jdk-7u79-linux-x64.tar.gz
COPY
kopiert eine Datei / ein Verzeichnis von Ihrem Host auf Ihr Image.ADD
kopiert eine Datei / ein Verzeichnis von Ihrem Host auf Ihr Image, kann aber auch Remote-URLs abrufen, TAR-Dateien extrahieren usw.Verwenden Sie
COPY
für einfaches Kopieren von Dateien und / oder Verzeichnisse in den Build - Kontext.Verwenden Sie
ADD
für Remote - Ressourcen Herunterladen, Extrahieren von TAR - Dateien, etc ..quelle
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. Dies liegt daran, dass es transparenter als ADD ist. COPY unterstützt nur das grundlegende Kopieren lokaler Dateien in den Container, während ADD einige Funktionen bietet (wie die lokale Teerextraktion und Remote-URL-Unterstützung), die nicht sofort offensichtlich sind. Folglich ist die beste Verwendung für ADD die automatische Extraktion lokaler TAR-Dateien in das Image, wie in ADD rootfs.tar.xz /.
Wenn Sie mehrere Dockerfile-Schritte haben, die unterschiedliche Dateien aus Ihrem Kontext verwenden, kopieren Sie diese einzeln und nicht alle gleichzeitig. Dadurch wird sichergestellt, dass der Build-Cache jedes Schritts nur ungültig wird (wodurch der Schritt erneut ausgeführt werden muss), wenn sich die speziell erforderlichen Dateien ändern.
Zum Beispiel:
Dies führt zu weniger Cache-Ungültigmachungen für den RUN-Schritt als beim Kopieren. / tmp / davor.
Da die Bildgröße wichtig ist, wird dringend davon abgeraten, ADD zum Abrufen von Paketen von Remote-URLs zu verwenden. 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 Ihrem Bild keine weitere Ebene hinzufügen. Sie sollten beispielsweise Folgendes vermeiden:
Und machen Sie stattdessen etwas wie:
Für andere Elemente (Dateien, Verzeichnisse), für die die automatische Teerextraktionsfunktion von ADD nicht erforderlich ist, sollten Sie immer COPY verwenden. "
quelle
Quelle: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :
quelle
Beim Erstellen einer Docker-Datei gibt es zwei Befehle, mit denen Sie Dateien / Verzeichnisse in diese kopieren können -
ADD
undCOPY
. Obwohl es geringfügige Unterschiede im Umfang ihrer Funktion gibt, erfüllen sie im Wesentlichen dieselbe Aufgabe.Warum haben wir zwei Befehle und woher wissen wir, wann wir den einen oder anderen verwenden müssen?
DOCKER
ADD
BEFEHLBeginnen wir mit der Feststellung, dass der
ADD
Befehl älter als istCOPY
. Seit dem Start der Docker-Plattform ist dieADD
Anweisung Teil der Befehlsliste.Der Befehl kopiert Dateien / Verzeichnisse in ein Dateisystem des angegebenen Containers.
Die grundlegende Syntax für den
ADD
Befehl lautet:Es enthält die Quelle, die Sie kopieren möchten (
<src>
), gefolgt von dem Ziel, an dem Sie es speichern möchten (<dest>
). Wenn die Quelle ein Verzeichnis ist,ADD
kopiert sie alles darin (einschließlich der Metadaten des Dateisystems).Wenn die Datei beispielsweise lokal verfügbar ist und Sie sie dem Verzeichnis eines Bildes hinzufügen möchten, geben Sie Folgendes ein:
ADD
kann auch Dateien von einer URL kopieren. Es kann eine externe Datei herunterladen und an das gewünschte Ziel kopieren. Zum Beispiel:Eine zusätzliche Funktion besteht darin, dass komprimierte Dateien kopiert werden und der Inhalt des angegebenen Ziels automatisch extrahiert wird. Diese Funktion gilt nur für lokal gespeicherte komprimierte Dateien / Verzeichnisse.
Beachten Sie, dass Sie eine komprimierte Datei / ein komprimiertes Verzeichnis nicht von einer URL herunterladen und extrahieren können. Der Befehl entpackt keine externen Pakete, wenn diese in das lokale Dateisystem kopiert werden.
DOCKER
COPY
BEFEHLAufgrund einiger Funktionsprobleme musste Docker einen zusätzlichen Befehl zum Duplizieren von Inhalten einführen
COPY
.Im Gegensatz zu seinem eng verwandten
ADD
BefehlCOPY
hat nur eine Funktion zugewiesen. Seine Aufgabe besteht darin, Dateien / Verzeichnisse an einem bestimmten Ort in ihrem vorhandenen Format zu duplizieren. Dies bedeutet, dass es nicht darum geht, eine komprimierte Datei zu extrahieren, sondern sie so wie sie ist zu kopieren.Die Anweisung kann nur für lokal gespeicherte Dateien verwendet werden. Daher können Sie es nicht mit URLs verwenden, um externe Dateien in Ihren Container zu kopieren.
COPY
Befolgen Sie zur Verwendung der Anweisung das grundlegende Befehlsformat:Geben Sie die Quelle ein und geben Sie an, wo der Befehl den Inhalt wie folgt extrahieren soll:
Zum Beispiel:
Welcher Befehl soll verwendet werden? (Best Practice)
In Anbetracht der Umstände, unter denen der
COPY
Befehl eingeführt wurde, ist es offensichtlich, dass das HaltenADD
eine Notwendigkeit war. Docker hat ein offizielles Dokument veröffentlicht, in dem Best Practices für das Schreiben von Docker-Dateien beschrieben sind. Es wird ausdrücklich davon abgeraten, die zu verwendenADD
Befehls .In der offiziellen Dokumentation von Docker wird darauf hingewiesen, dass dies
COPY
immer die Anlaufstelle sein sollte, da sie transparenter ist alsADD
.Wenn Sie aus dem lokalen Build-Kontext in einen Container kopieren müssen, bleiben Sie bei der Verwendung
COPY
.Das Docker-Team rät außerdem dringend davon ab,
ADD
ein Paket von einer URL herunterzuladen und zu kopieren. Stattdessen ist es sicherer und effizienter, wget oder curl innerhalb einesRUN
Befehls zu verwenden. Auf diese Weise vermeiden Sie das Erstellen einer zusätzlichen Bildebene und sparen Platz.quelle
Wichtige Notiz
Ich musste
COPY
und entpacke Java-Paket in meinem Docker-Image. Beim Vergleich der mit ADD erstellten Docker-Bildgröße war sie 180 MB größer als die mit COPY, tar -xzf * .tar.gz und rm * .tar.gz erstellteDies bedeutet, dass ADD die TAR-Datei zwar entfernt, aber dennoch irgendwo aufbewahrt wird. Und es macht das Bild größer !!
quelle
Da Docker 17.05
COPY
mit dem--from
Flag in mehrstufigen Builds verwendet wird, um Artefakte aus früheren Build-Phasen in die aktuelle Build -Phase zu kopieren.aus der Dokumentation
quelle
Dies ist eine weitere 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 unterscheidet sich von anderen Volumes, da ein Hostverzeichnis nur für den Build bereitgestellt wird. Dateien können mit einem Standardbefehl cp kopiert werden.
Ebenso wie Curl und Wget kann es in einem Befehlsstapel ausgeführt werden (wird in einem einzelnen Container ausgeführt) und die Bildgröße nicht multipliziert. ADD und COPY sind nicht stapelbar, da sie in einem eigenständigen Container ausgeführt werden und nachfolgende Befehle für Dateien, die in zusätzlichen Containern ausgeführt werden, die Bildgröße multiplizieren:
Mit den folgenden Optionen:
Folgendes wird in einem Container ausgeführt:
quelle
unknown shorthand flag: 'v' in -v