Wie kopiere ich mehrere Dateien in einer Ebene mit einer Docker-Datei?

245

Das Folgende Dockerfileenthält vier COPYSchichten:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Wie kopiere ich diese Dateien stattdessen mit einer Ebene? Folgendes wurde versucht:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
kazhuravlev
quelle

Antworten:

427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

oder

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Sie können auch Platzhalterzeichen in der Quellendatenspezifikation verwenden. Weitere Informationen finden Sie in den Dokumenten .

Verzeichnisse sind etwas Besonderes! Wenn du schreibst

COPY dir1 dir2 ./

das funktioniert eigentlich so

COPY dir1/* dir2/* ./

Wenn Sie mehrere Verzeichnisse (nicht deren Inhalt) in einem einzigen Befehl unter ein Zielverzeichnis kopieren möchten, müssen Sie den Erstellungskontext so einrichten, dass sich Ihre Quellverzeichnisse unter einem gemeinsamen übergeordneten und dann unter COPYdiesem übergeordneten Verzeichnis befinden .

Nathaniel Waisbrot
quelle
53
Beachten Sie, dass , wenn die Quellen sind Verzeichnisse, dies kopiert die Verzeichnisinhalte , nicht die Verzeichnisse selbst.
Claudiu
7
Beachten Sie auch, dass das Zielverzeichnis dasselbe ist. Wenn Sie viele verschiedene Dateien mit unterschiedlichen Zielen erstellen, sollten Sie ein Overlay-Dateisystem (wie eine Chroot) erstellen, dieses in ein tarArchiv umwandeln und mit ADD hinzufügen.
tu-Reinstate Monica-dor duh
4
@Claudiu Wie kopiere ich die Ordner selbst?
k0pernikus
5
@ k0pernikus können Sie COPY myDir1 ./MyDir1/
Manuel Manhart
@ manuel-manhart Gibt es jemanden, der weiß, ob wir die Liste der Dateien mit einem Build-Parameter parametrisieren können? github.com/moby/moby/issues/38532 ?
Marcello de Sales
52
COPY <all> <the> <things> <last-arg-is-destination>

Aber hier ist ein wichtiger Auszug aus den Dokumenten:

Wenn Sie mehrere Dockerfile-Schritte haben, die unterschiedliche Dateien aus Ihrem Kontext verwenden, kopieren Sie diese einzeln und nicht alle gleichzeitig. Dadurch wird sichergestellt, dass der Build-Cache jedes Schritts nur ungültig wird (wodurch der Schritt erneut ausgeführt werden muss), wenn sich die speziell erforderlichen Dateien ändern.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

swapsCAPS
quelle
Weißt du, ob wir "alle Dinge" parametrisieren können? Build-Parameter verwenden? github.com/moby/moby/issues/38532 ???
Marcello de Sales
@MarcellodeSales nicht sicher, warum Sie das brauchen würden. Warum erstellen Sie kein Basis-Image ohne diese Dateien und die untergeordneten Images enthalten dann die Kopieranweisung - wenn sie den Pfad trotzdem definieren müssen, macht dies keinen großen Unterschied. Oder Sie lassen es einfach ganz auf den Bildern weg und hängen es in den Container ein - dort haben Sie die .env-Dateien, um diese konfigurierbar zu machen.
Manuel Manhart
Sie können auch jederzeit über einen vorhandenen Pfad kopieren, da das Dateisystem überlagert ist und den bereits vorhandenen Inhalt überlappt / schattiert.
Manuel Manhart
@ManuelManhart, ich erstelle mit ONBUILD COPY ein dynamisch parametrisiertes Image ... Als Teil einer Plattform verstecke ich die Komplexität dessen, was im Image getan werden muss. Deshalb müssen die Werte bereitgestellt werden als Parameter.
Marcello de Sales
@MarcellodeSales Ich glaube nicht, dass dies momentan / noch unterstützt wird. Aber Sie könnten Build-Argumente verwenden, um es zu kapseln, siehe stackoverflow.com/questions/43654656/…
Manuel Manhart
7

einfach

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

aus dem doc

Wenn mehrere Ressourcen entweder direkt oder aufgrund der Verwendung eines Platzhalters angegeben werden, muss es sich um ein Verzeichnis handeln, das mit einem Schrägstrich / enden muss.

Edwin Ikechukwu Okonkwo
quelle
6

Es kann erwähnenswert sein, dass Sie auch eine .dockerignoreDatei erstellen können, um die Dateien auszuschließen, die Sie nicht kopieren möchten:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Bevor die Docker-CLI den Kontext an den Docker-Daemon sendet, sucht sie im Stammverzeichnis des Kontexts nach einer Datei mit dem Namen .dockerignore. Wenn diese Datei vorhanden ist, ändert die CLI den Kontext, um Dateien und Verzeichnisse auszuschließen, die mit den darin enthaltenen Mustern übereinstimmen. Auf diese Weise wird vermieden, dass große oder vertrauliche Dateien und Verzeichnisse unnötig an den Dämon gesendet und möglicherweise mithilfe von ADD oder COPY zu Bildern hinzugefügt werden.

Aaron
quelle