Sie sind neu bei Docker und lernen, benutzerdefinierte Docker-Images mit Dockerfile zu erstellen.
Sie stoßen auf eine Vielzahl von Dockerfile-Anweisungen wie FROM, RUN usw.
Dann stoßen Sie auf COPY und ADD und stellen fest, dass beide Anweisungen die gleiche Aufgabe erfüllen. Kopieren Sie die Dateien und Verzeichnisse vom Host in Ihr modifiziertes Docker-Image.
Warum hat Dockerfile zwei Befehle für dieselbe Aufgabe? Gibt es einen Unterschied zwischen den beiden? In der Tat. Sie haben ähnliche Ziele, aber in Bezug auf das Verhalten unterscheiden sie sich.
Lassen Sie mich das für Sie erklären.
Dockerfile HINZUFÜGEN vs. KOPIEREN
Sowohl ADD als auch COPY wurden entwickelt, um Ihrem Docker-Image Verzeichnisse und Dateien hinzuzufügen.
Die ADD-Anweisung ist relativ älter und kann mehr als nur Dateien und Verzeichnisse kopieren. ADD kann Dateien von externen URLs abrufen. Es kann auch komprimierte Dateien extrahieren, vorausgesetzt, es unterstützt das Archivformat. Dies führt auch manchmal zu einem Problem, wenn ADD das Archivformat nicht unterstützen kann.
Wenn ADD das alles kann, warum haben wir dann COPY? Das liegt daran, dass die Docker-Befehle bisher mehrfach umstrukturiert wurden. Der Schwerpunkt liegt auf der Bereitstellung einer einfachen, geradlinigen und optimierten Befehlsstruktur.
COPY wurde als direkter Ersatz für ADD eingeführt. COPY kopiert nur Dateien und Verzeichnisse. Das ist es. Zum Herunterladen und Extrahieren von Dateien werden normale Linux-Befehle wie curl und tar mit den RUN-Anweisungen verwendet.
Aus diesem Grund wird heutzutage COPY empfohlen und ADD findet man nur noch in älteren Tutorials und Dokumentationen.
ADD ist eine ältere Anweisung, die Dateien herunterladen und extrahieren kann, abgesehen davon, dass sie vom Host in die Bilder kopiert werden. COPY kann nur die Dateien und Verzeichnisse kopieren. Kopieren wird heutzutage empfohlen.Sehen Sie sich die ADD-Anweisung genauer an
Der ADD-Befehl hat die folgenden drei Fähigkeiten:
1. Kopieren von lokalen Dateien in das Container-Image
Angenommen, Sie möchten lokale Dateien auf dem Hostsystem von /home/user/application
kopieren in /opt/app
auf Ihrem Docker-Image können Sie die folgende Anweisung in Ihre Dockerfile einfügen:
ADD /home/user/application /opt/app
Hier nur der Inhalt der /home/user/application
Verzeichnis wird nach /opt/app
kopiert einschließlich seiner Metadaten. Die application
wird nicht kopiert Verzeichnis selbst.
2. Extrahieren von lokal gespeicherten Tar-Dateien
Sie können auch die ADD-Anweisung verwenden, um komprimierte Archive mit Formaten zu extrahieren - Identität , gzip , bzip2 oder xz . Der Inhalt wird als Verzeichnis im Zielspeicherort des von Ihnen erstellten Docker-Images entpackt.
ADD /home/user/test.tar.gz /opt
Das Verhalten ähnelt dem, was passiert, wenn Sie den tar-Befehl verwenden, um einen Tarball in ein bestimmtes Verzeichnis auf Ihrem Hostsystem zu extrahieren.
3. Eine Datei von einer URL herunterladen
Es ist ähnlich wie wget -P
funktioniert aber für Dockerfiles. Während Sie Ihr Docker-Image erstellen, können Sie die folgende Anleitung verwenden, um eine Datei herunterzuladen und an einem gewünschten Ort auf Ihrem Container-Image zu speichern:
ADD https://filesamples.com/samples/document/pdf/sample2.pdf /home/user
Nachdem das Image erstellt wurde, können Sie dieses PDF-Dokument haben, bevor Sie einen darauf basierenden Container starten. Dies ist einer von vielen einzigartigen Anwendungsfällen.
Die COPY-Anweisung
Die COPY-Anweisung ist eine Weiterentwicklung der ADD-Anweisung, die entwickelt wurde, um Verwirrung unter Docker-Benutzern zu vermeiden. Seine Funktion ist nur eine – Kopieren von Dateien oder Verzeichnissen vom Quellspeicherort auf dem Host zum Zielspeicherort auf dem Docker-Image.
Es ist also im Grunde der erste Punkt im Abschnitt ADD-Befehl, der oben besprochen wurde. Die entsprechende Anweisung wäre:
COPY /home/user/application /opt/app
Als Best Practice empfehlen die Entwickler von Docker offiziell, die obige Anleitung zu verwenden, um Verwirrung zu vermeiden.
Wenn Sie also nur Dateien oder Verzeichnisse kopieren möchten, sollten Sie die COPY-Anweisung allein verwenden. Versuchen Sie, ADD nach Möglichkeit zu vermeiden. Verwenden Sie die RUN-Anweisungen mit regulären Linux-Befehlen zum Herunterladen und Extrahieren von Dateien.
Ich hoffe, dass Sie jetzt den grundlegenden Unterschied zwischen den beiden Anweisungen verstehen können. Um sie einzeln zu verstehen, können Sie sich die offizielle und vollständige Referenz von ADD und COPY ansehen.
Wenn Sie Vorschläge, Feedback oder Kommentare zum obigen Vergleich haben, hinterlassen Sie bitte Ihre Gedanken im Abschnitt unten.