Beim Erstellen einer Docker-Datei gibt es zwei Befehle, mit denen Sie Dateien / Verzeichnisse in diese kopieren können - ADD
und COPY
. 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
BEFEHL
Beginnen wir mit der Feststellung, dass der ADD
Befehl älter als ist COPY
. Seit dem Start der Docker-Plattform ist die ADD
Anweisung Teil der Befehlsliste.
Der Befehl kopiert Dateien / Verzeichnisse in ein Dateisystem des angegebenen Containers.
Die grundlegende Syntax für den ADD
Befehl lautet:
ADD <src> … <dest>
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 /source/file/path /destination/path
ADD
kann auch Dateien von einer URL kopieren. Es kann eine externe Datei herunterladen und an das gewünschte Ziel kopieren. Zum Beispiel:
ADD http://source.file/url /destination/path
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.
ADD source.file.tar.gz /temp
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
BEFEHL
Aufgrund einiger Funktionsprobleme musste Docker einen zusätzlichen Befehl zum Duplizieren von Inhalten einführen COPY
.
Im Gegensatz zu seinem eng verwandten ADD
Befehl COPY
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:
COPY <src> … <dest>
Zum Beispiel:
COPY /source/file/path /destination/path
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 Halten ADD
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 als ADD
.
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 eines RUN
Befehls zu verwenden. Auf diese Weise vermeiden Sie das Erstellen einer zusätzlichen Bildebene und sparen Platz.