Einführung
Beim Erstellen einer Dockerfile gibt es zwei Befehle, mit denen Sie Dateien/Verzeichnisse hineinkopieren können – ADD
und COPY
. Obwohl es geringfügige Unterschiede im Funktionsumfang gibt, erfüllen sie im Wesentlichen die gleiche Aufgabe.
Warum haben wir also zwei Befehle und woher wissen wir, wann wir den einen oder den anderen verwenden müssen?
In diesem Artikel erklären wir jeden Befehl, analysieren Docker ADD vs. COPY und sagen Ihnen, welcher zu verwenden ist.
Docker-ADD-Befehl
Beginnen wir damit, dass die ADD
Befehl ist älter als COPY
. Seit dem Start der Docker-Plattform ist das ADD
Instruktion wurde Teil seiner Befehlsliste.
Der Befehl kopiert Dateien/Verzeichnisse in ein Dateisystem des angegebenen Containers.
Die grundlegende Syntax für ADD
Befehl ist:
ADD <src> … <dest>
Es enthält die Quelle, die Sie kopieren möchten (<src>
) gefolgt vom Ziel, an dem Sie es speichern möchten (<dest>
). Wenn die Quelle ein Verzeichnis ist, ADD
kopiert alles darin (einschließlich 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 ist, dass es komprimierte Dateien kopiert und den Inhalt automatisch am angegebenen Ziel extrahiert. Diese Funktion gilt nur für lokal gespeicherte komprimierte Dateien/Verzeichnisse.
Geben Sie die Quelle und den Ort ein, an dem der Befehl den Inhalt extrahieren soll, wie folgt:
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 er sie in das lokale Dateisystem kopiert.
Docker-Kopierbefehl
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 zugewiesene Funktion. Seine Aufgabe besteht darin, Dateien/Verzeichnisse an einem bestimmten Ort in ihrem vorhandenen Format zu duplizieren. Dies bedeutet, dass es sich nicht um das Extrahieren einer komprimierten Datei handelt, sondern sie so kopiert, wie sie ist.
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.
So verwenden Sie COPY
Anweisung folgen Sie dem grundlegenden Befehlsformat:
COPY <src> … <dest>
Zum Beispiel:
COPY /source/file/path /destination/path
Docker-Kopie vs. HINZUFÜGEN
Warum musste ein neuer, ähnlicher Befehl hinzugefügt werden?
Die Tatsache, dass ADD
So viele Funktionalitäten hatten sich in der Praxis als problematisch erwiesen, da sie sich äußerst unberechenbar verhielten. Das Ergebnis einer solchen unzuverlässigen Leistung war oft das Kopieren, wenn Sie extrahieren wollten, und das Extrahieren, wenn Sie kopieren wollten.
Docker konnte den Befehl aufgrund seiner vielen bestehenden Verwendungen nicht vollständig ersetzen. Um Abwärtskompatibilität zu vermeiden, bestand die sicherste Option darin, COPY
hinzuzufügen Befehl – ein weniger vielfältiger, aber zuverlässigerer Befehl.
Was zu verwenden ist (Best Practices)
In Anbetracht der Umstände, unter denen die COPY
Befehl eingeführt wurde, ist es offensichtlich, dass die Beibehaltung von ADD eine Frage der Notwendigkeit war. Docker hat ein offizielles Dokument veröffentlicht, in dem Best Practices zum Schreiben von Dockerfiles beschrieben werden, das ausdrücklich von der Verwendung des ADD
abrät Befehl .
In der offiziellen Dokumentation von Docker wird darauf hingewiesen, dass COPY
sollte immer die erste Anweisung sein, da sie transparenter ist als ADD
.
Wenn Sie aus dem lokalen Build-Kontext in einen Container kopieren müssen, bleiben Sie bei der Verwendung von COPY
.
Das Docker-Team rät außerdem dringend von der Verwendung von ADD
ab um ein Paket von einer URL herunterzuladen und zu kopieren. Stattdessen ist es sicherer und effizienter, wget zu verwenden oder Curl innerhalb eines RUN
Befehl. Dadurch vermeiden Sie das Erstellen einer zusätzlichen Bildebene und sparen Platz.
Angenommen, Sie möchten ein komprimiertes Paket von einer URL herunterladen, den Inhalt extrahieren und das Archiv bereinigen.
Anstatt ADD
zu verwenden und den folgenden Befehl ausführen:
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
Sie sollten verwenden:
RUN curl http://source.file/package.file.tar.gz \
| tar -xjC /tmp/ package.file.tar.gz \
&& make -C /tmp/ package.file.tar.gz