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?
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?
Antworten:
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
/config/nginx/ /config/logstash/Ich finde das in der Container-Bash:ls config/ gunicorn logs logstash nginx
ls /config/, haben Sie versucht, diese Pfade zu Ihrem .dockerignore hinzuzufügen, ohne den führenden /?
node_modulesnicht in Unterverzeichnissen.
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.
COPY failed: no source files were specifiedwenn es keine Dateien gibt, die mit 'nein' beginnen, aber nicht mit 'nicken'.
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.
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.
composer.lockbevor composer install. Ohne die Sperrdatei wird beim nächsten Erstellen möglicherweise ein anderer Satz von Abhängigkeiten (der Herstellerordner) installiert.
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)
Knoten_Module aus dem aktuellen Verzeichnis ausschließen
node_modules
Ausschluss von node_modules in unmittelbaren Unterverzeichnissen
*/node_modules
Hier sind die offiziellen Dokumente
.dockerignore?