KOPIE mit Docker, aber mit Ausschluss

229

In einer Docker-Datei habe ich

COPY . .

Ich möchte ein ganzes Verzeichnis ausschließen, in meinem Fall das Verzeichnis node_modules.

Etwas wie das:

   COPY [all but **/node_modules/**] .

Ist das mit Docker möglich?

Alexander Mills
quelle
22
Wie wäre es .dockerignore?
Anthony Sottile
Ich suche nach einer Antwort auf diese verwandte Frage: stackoverflow.com/questions/50547489/…
Alexander Mills

Antworten:

374

Erstellen Sie eine Datei .dockerignorein Ihrem Docker-Build-Kontextverzeichnis (in diesem Fall also höchstwahrscheinlich ein Verzeichnis, das node_modules übergeordnet ist) mit einer Zeile darin:

**/node_modules

obwohl du wahrscheinlich nur willst:

node_modules

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

vith
quelle
5
danke, also die "KOPIE ..." Befehl muss sich nicht ändern, denke ich
Alexander Mills
Nicht wirklich: /config/nginx/ /config/logstash/Ich finde das in der Container-Bash:ls config/ gunicorn logs logstash nginx
SalahAdDin
3
@SalahAdDin aus dem gleichen Grund, aus dem Sie nicht geschrieben haben ls /config/, haben Sie versucht, diese Pfade zu Ihrem .dockerignore hinzuzufügen, ohne den führenden /?
Pablo
8
Funktioniert einfach node_modulesnicht in Unterverzeichnissen.
Rustyx
5
Dies löst das Problem nicht wirklich, wenn Sie es KOPIEREN lassen möchten, aber nur nicht in dieser Ebene ...
Wes
33

Für diejenigen, die keine .dockerignore-Datei verwenden können (z. B. wenn Sie die Datei in einer KOPIE, aber nicht in einer anderen benötigen):

Ja, aber Sie benötigen mehrere COPY-Anweisungen. Insbesondere benötigen Sie eine KOPIE für jeden Buchstaben im Dateinamen, den Sie ausschließen möchten.

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

Fahren Sie fort, bis Sie den vollständigen Dateinamen oder nur das Präfix haben, von dem Sie ziemlich sicher sind, dass es keine anderen Dateien mehr gibt.

Alex
quelle
1
Dies wird nicht wert sein, weil Sie eine erhalten, COPY failed: no source files were specifiedwenn es keine Dateien gibt, die mit 'nein' beginnen, aber nicht mit 'nicken'.
Mheck
1
Alternativ können Sie zwei verschiedene Unterverzeichnisse (für verschiedene Kopierziele) verwenden, sodass ich z. B. in meinem Nginx-Setup src/zu /var/wwwund /conf/nginx.confgehen würde /etc/nginx/conf.d/default.conf. Sie können auch alles kopieren und RUN rm -r confspäter (auch den Quellbaum so lassen, wie er war). Ich würde gerne hören, ob jemand einen anderen Vorschlag hat.
Yuval
1
Was wäre eine Lösung für bestimmte Dateitypen oder Dateiendungen, wenn ich das so machen würde?
Lea Reimann
Der einzige Nachteil dieses Ansatzes ist, dass Ihre Ordnerstruktur abgeflacht ist
Islam Q.
8

In meinem Fall enthielt meine Docker-Datei einen Installationsschritt, der das vendorVerzeichnis (das PHP-Äquivalent von node_modules) erzeugte . Ich übergebe dann COPYdieses Verzeichnis zum endgültigen Anwendungsbild. Daher konnte ich vendormeine nicht einsetzen .dockerignore. Meine Lösung bestand einfach darin, das Verzeichnis vor der Ausführung zu löschen composer install(das PHP-Äquivalent von npm install).

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

Diese Lösung funktioniert und bläht das endgültige Image nicht auf, ist jedoch nicht ideal, da das vendorVerzeichnis auf dem Host während des Erstellungsprozesses in den Docker-Kontext kopiert wird, was die Zeit verlängert.

Cameron Hudson
quelle
3
Beachten Sie sicher , warum Sie entfernen müssen , composer.lockbevor composer install. Ohne die Sperrdatei wird beim nächsten Erstellen möglicherweise ein anderer Satz von Abhängigkeiten (der Herstellerordner) installiert.
Lacek
1
@Lacek: Du hast recht. Ich habe besser gelernt, seit ich das gepostet habe.
Cameron Hudson
1
@CameronHudson aktualisiert möglicherweise Ihre ursprüngliche Antwort, bevor Leute diese schlechte Praxis kopieren / einfügen.
Robin van Baalen
2

Das Hinzufügen von .dockerignore funktioniert für mich. Ein zusätzlicher Punkt Wenn Sie diese Lösung unter Windows oder Windows ausprobieren, können Sie keine .dockerignore-Datei erstellen Sie keine (da dies standardmäßig nicht das Erstellen von Dateien ab.) Ermöglicht.

So erstellen Sie eine solche Datei beginnend mit. unter Windows , auch eine Endung Punkt, wie: .dockerignore.und drücken Sie die Eingabetaste (vorausgesetzt , Sie sehen Erweiterung Optionen von Ordneroptionen aktiviert haben)

Paras Patidar
quelle
6
Sie können eine Datei in Fenstern erstellen, die mit einem Punkt beginnt, indem Sie sie auch mit einem Punkt beenden.
Jim Pedid
0

Knoten_Module aus dem aktuellen Verzeichnis ausschließen

node_modules

Ausschluss von node_modules in unmittelbaren Unterverzeichnissen

*/node_modules

Hier sind die offiziellen Dokumente

kta
quelle