GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Docker ADD vs. COPY:Was sind die Unterschiede?

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

Docker
  1. MySQL vs. MariaDB:Was sind die Hauptunterschiede zwischen ihnen?

  2. Debian vs. Ubuntu:Was sind die Unterschiede?

  3. Was sind die Unterschiede zwischen dem von Ubuntu gelieferten Kernel und dem Upstream-Kernel?

  4. Was ist der Unterschied zwischen COPY und ADD in Dockerfiles?

  5. Was sind die funktionalen Unterschiede zwischen .profile .bash_profile und .bashrc

Terraform vs. Kubernetes:Was sind die Unterschiede?

IMAP vs. POP3 vs. SMTP:Was sind die Unterschiede?

Was sind die Unterschiede zwischen cPanel und WHM?

Was ist der Unterschied zwischen COPY- und ADD-Anweisungen in Dockerfile?

Docker File vs. Docker Compose:Was ist der Unterschied?

useradd vs. adduser:Was sind die Unterschiede?