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 .dockerignore
in 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_modules
nicht 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 specified
wenn es keine Dateien gibt, die mit 'nein' beginnen, aber nicht mit 'nicken'.
src/
zu /var/www
und /conf/nginx.conf
gehen würde /etc/nginx/conf.d/default.conf
. Sie können auch alles kopieren und RUN rm -r conf
spä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 vendor
Verzeichnis (das PHP-Äquivalent von node_modules
) erzeugte . Ich übergebe dann COPY
dieses Verzeichnis zum endgültigen Anwendungsbild. Daher konnte ich vendor
meine 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 vendor
Verzeichnis auf dem Host während des Erstellungsprozesses in den Docker-Kontext kopiert wird, was die Zeit verlängert.
composer.lock
bevor 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
?