wake-up-neo.com

KOPIEREN mit Docker aber mit Ausschluss

In einer Dockerfile habe ich

COPY . .

Ich möchte ein gesamtes Verzeichnis ausschließen, in diesem Fall das Verzeichnis node_modules.

Etwas wie das:

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

Ist das mit Docker möglich?

90
Alexander Mills

Erstellen Sie die Datei .dockerignore in Ihrem Docker-Build-Kontextverzeichnis (in diesem Fall höchstwahrscheinlich ein übergeordnetes Verzeichnis von node_modules) mit einer Zeile: 

**/node_modules

obwohl Sie wahrscheinlich nur wollen:

node_modules

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

158
vith

In meinem Fall enthielt meine Docker-Datei einen Installationsschritt, der das Verzeichnis vendor erzeugte (das PHP Äquivalent von node_modules). Ich dann COPY dieses Verzeichnis über das endgültige Anwendungsbild. Daher konnte ich vendor nicht in mein .dockerignore einfügen. Meine Lösung bestand einfach darin, das Verzeichnis zu löschen, bevor composer install ausgeführt wurde (das PHP Äquivalent zu npm install).

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf composer.lock 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 Verzeichnis vendor auf dem Host während des Erstellungsprozesses in den Docker-Kontext kopiert wird, wodurch zusätzliche Zeit benötigt wird.

5
Cameron Hudson

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

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, und Sie sind sich ziemlich sicher, dass es keine anderen Dateien gibt.

2
Alex

Hinzufügen von .dockerignore funktioniert für mich ..__ Ein weiterer Punkt Diejenigen, die diese Lösung unter Windows, windows versuchen, können keine .dockerignore-Datei erstellen (da dies standardmäßig nicht erlaubt, Dateien zu erstellen beginnen mit .)

der Trick dazu wird hier erwähnt: https://www.hanselman.com/blog/HowToCreateAFileWithADotPrefixInWindowsExplorer.aspx

dazu gehört auch ein Endpunkt, wie: .dockerignore. und drücken Sie die Eingabetaste (vorausgesetzt, Sie haben die Erweiterungsoptionen für die Ansicht über Ordneroptionen aktiviert).

1
Paras Patidar