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.