2014-12-24 1 views
12

Ich plane eine Docker-Umgebung und zweifelhaft, ob die Ausführung npm install als Cache-Layer eine gute Idee ist.Docker und node_modules - legen Sie sie in eine Schicht oder ein Volumen?

Ich verstehe, dass es ways to optimize dockerfiles to avoid rebuilding node_modules unless package.json changes gibt, aber ich möchte nicht komplett node_modules jedes Mal umwandeln package.json ändert sich entweder. Eine frische npm install dauert für uns 5 Minuten, und Änderungen an package.json passieren ziemlich häufig. Für jemanden, der Pull Requests wiederholt und Zweige wechselt, könnten sie jeden Tag eine ärgerliche Menge von 5 Minuten npm installs erleiden müssen.

Wäre es nicht besser in Fällen wie meiner, irgendwie zu installieren node_modules in einem Volume, so dass es über Builds bleibt, und kleine Änderungen an package.json nicht dazu führen, dass die gesamte Abhängigkeitsstruktur wird neu erstellt?

Antwort

8

Ja. Erstellen Sie keine node_modules immer wieder neu. Einfach in einen Datencontainer stecken und nur lesen. Sie können eine zentrale Prozesswiederherstellung node_modules ab und zu haben.

Als zusätzlichen Vorteil erhalten Sie einen berechenbareren Build, da Sie erzwingen können, dass alle die gleichen Knotenmodule verwenden. Dies ist entscheidend, wenn Sie sicher sein wollen, dass Sie tatsächlich dasselbe testen, das Sie in Produktion bringen möchten.

Etwas Ähnliches (nicht getestet!):

docker build -t my/module-container - <<END_DOCKERFILE 
FROM busybox 
RUN mkdir -p /usr/local/node 
VOLUME /usr/local/node 
END_DOCKERFILE 

docker run --name=module-container my/module-container 

docker run --rm --volumes-from=module-container \ 
    -v package.json:/usr/local/node/package.json \ 
    /bin/bash -c "cd /usr/local/node; npm install" 

Mittlerweile enthalten die Datencontainer module-container werden die von package.json in /usr/local/node/node_modules spezifizierten Module. Es sollte nun möglich sein, es unter Verwendung von --volume-from=module-container in den Produktionsbehältern zu montieren.

+0

Ich versuche herauszufinden, wie dies zu tun ist. Gibt es einen Leitfaden, der zeigt, wie man das einrichten kann? Können Sie eine Konfigurationsdatei erstellen, um dies zu demonstrieren? – Scotty

+0

Ich habe meine Antwort oben aktualisiert. – mzedeler

Verwandte Themen