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

Was ist der Unterschied zwischen COPY und ADD in Dockerfiles?

ADD und COPY sind zwei ähnliche Dockerfile Anweisungen, mit denen Sie während der Erstellungszeit Inhalte zu Ihren Bildern hinzufügen können. Während COPY ist eine direkte Quelle-zu-Ziel-Kopie, ADD enthält zusätzliche Funktionen für die Arbeit mit Archiven und Remote-URLs.

KOPIEREN

COPY ist die einfachere der beiden Anweisungen. Es akzeptiert zwei Argumente, eine Quelle und ein Ziel:

COPY example.txt /example/dir/example.txt

Der Quellpfad wird von Ihrem Docker-Host in das Dateisystem des Containers kopiert. Das erstellte Image enthält die kopierte Datei oder das kopierte Verzeichnis im angegebenen Zielpfad.

COPY funktioniert mit allen Dateien und Verzeichnissen, aber die Quellpfade sind auf diejenigen in Ihrem aktiven Build-Kontext beschränkt. Der Kontext wird festgelegt, wenn Sie docker build ausführen :

docker build .

# OR

docker build /path/to/context

Die Anweisung erstellt automatisch das Zielverzeichnis im Container, wenn es noch nicht existiert. Wenn Sie einen abschließenden Schrägstrich (/ ), behandelt Docker das Ziel als Verzeichnis und legt die Quelldatei darin ab.

Sie können Platzhalter wie *.jpg verwenden im Quellpfad Ziel, um eine Reihe von Dateien abzugleichen. Diese Ausdrücke werden mit Go filepath analysiert Matcher.

Kopierte Dateien haben standardmäßig eine UID und GID von 0. Dies kann mit dem optionalen --chown angepasst werden Flag, das UIDs, GIDs und Namen akzeptiert. Es führt chown aus auf die kopierten Dateien, sobald sie sich im Container befinden:

COPY --chown=my-user:my-group example.txt /example.txt

COPY unterstützt auch ein --from Flagge. Dadurch wird der Quellpfad so geändert, dass er auf einen anderen verweist Container-Image anstelle Ihres lokalen Build-Kontexts. Es funktioniert auch mit mehrstufigen Builds, um Artefakte einzubeziehen, die in früheren Build-Phasen erstellt wurden.

# Copies /usr/bin/composer from the composer:latest image
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Multi-stage build example
# Stage 1: Copies example.scss from working directory into node:latest image
# Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest)
FROM node:latest AS sass
COPY example.scss .
RUN npm install -g node-sass && node-sass example.scss example.css
FROM httpd:latest
COPY --from=sass /example.css example.css

Der --from flag muss sich auf eine benannte Phase beziehen, die weiter oben in der Dockerfile aufgeführt ist . Wenn es keine übereinstimmende Phase gibt, geht Docker davon aus, dass Sie stattdessen auf ein Bild verweisen. Sie erhalten einen Build-Fehler, wenn das Bild nicht abgerufen werden kann.

HINZUFÜGEN

ADD hat dieselbe Syntax wie COPY , Quell- und Zielpfade akzeptieren. --from wird nicht unterstützt aber Sie können --chown verwenden .

Im Gegensatz zu COPY , ADD kann entfernte Datei-URLs herunterladen. Wenn Sie eine öffentlich zugängliche URL als Quellpfad angeben, wird diese Datei heruntergeladen und dem Container-Image hinzugefügt. Die Änderungszeit des Zielpfads (mtime ) wird auf den Wert von Last-Modified gesetzt Header in der HTTP-Antwort des Downloads.

ADD kann auch tar-Archive extrahieren, einschließlich mit gzip, bzip2 und xz komprimierter Archive. Durch Angabe eines kompatiblen Archivs als Quellpfad wird dessen Inhalt in das angegebene Containerverzeichnis entpackt. Der vorhandene Inhalt des Verzeichnisses bleibt erhalten.

Die Archiverkennung basiert auf dem tatsächlichen Dateiinhalt, nicht auf dem Dateinamen oder der Erweiterung. Sie können jede echte Archivdatei verwenden, ohne sie .tar zu nennen , .tar.gz oder .tar.xz .

Die Möglichkeit, Archive automatisch zu extrahieren, vereinfacht das Hinzufügen von Softwarepaketen, die als Tar-Dateien zu Ihren Container-Images verteilt werden. Bereitstellen eines Tar-Pfads für COPY würde die komprimierte Archivdatei unverändert kopieren, nicht ihren Inhalt. Sie müssen einen RUN verwenden Anweisung zum manuellen Dekomprimieren der Datei.

Das Verhalten rund um COPY gelten für ADD zu. Mit Ausnahme von Remote-URLs müssen Quellpfade in Ihrem Build-Kontext vorhanden sein. Der Zielpfad des Containers wird automatisch erstellt, wenn er nicht vorhanden ist, indem die Docker-Regeln für die Pfadauflösung verwendet werden.

Zusammenfassung

COPY und ADD sind zwei eng verwandte, aber deutlich unterschiedliche Anweisungen, die Sie beim Schreiben einer Dockerfile verwenden können . Da sich ihre Feature-Sets überschneiden, fragen Sie sich vielleicht, welches standardmäßig das „Beste“ ist.

Gemäß dem eigenen Best Practices-Leitfaden von Docker sollten Sie nach COPY greifen es sei denn, Sie benötigen die zusätzlichen Fähigkeiten von ADD . ADD ist eine undurchsichtige Operation, die dem Kopiervorgang Magie verleiht.

Nur mit ADD wenn es wirklich gebraucht wird, hilft, Ihre Absichten zu kommunizieren. Andernfalls riskieren Sie, Teammitglieder dazu zu bringen, ADD zu verwenden was verheerende Folgen haben könnte. Ein unbeabsichtigtes ADD my-archive.tar . statt COPY my-archive.tar könnte zu Verwirrung und fehlerhaften Builds führen, wenn der Inhalt des Archivs in Ihrem Container angezeigt wird, anstatt das Archiv selbst.

Sie sollten auch sorgfältig überlegen, wann es angebracht ist, ADD zu verwenden mit entfernten URLs. Es kann effizienter sein, curl zu verwenden oder wget mit einem RUN Anweisung, da dies das Zwischenspeichern von Bildebenen erleichtert. Ein ADD Anweisung wird immer den Cache für alle folgenden Build-Stufen ungültig machen, wenn sich die Datei an einer entfernten URL ändert.

Wenn möglich, empfiehlt es sich, kopierte Dateien nach der Verwendung zu löschen. Wenn Sie ein Software-Installationsprogramm herunterladen oder extrahieren, hilft das Löschen der einmaligen Binärdatei nach der Ausführung, Ihr endgültiges Image zu verschlanken.


Docker
  1. Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

  2. Was ist der Unterschied zwischen cPanel und WHM?

  3. Was ist der Unterschied zwischen strtok_r und strtok_s in C?

  4. Was ist der Unterschied zwischen adduser und useradd?

  5. Was ist der Unterschied zwischen $(CC) und $CC?

Was ist der Unterschied zwischen Cat und Touch Command?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

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

Was ist ein Hypervisor? Was ist der Unterschied zwischen Typ 1 und 2?

Was ist der Unterschied zwischen Curl und Wget?