Ich habe ein Docker-Image, nennen wir es frontend.image
, das ich für einen Jenkins-Build-Slave verwende. Das Jenkins Docker-Plug- in dreht einen Container aus diesem Image und erstellt Artefakte im Container. Das alles funktioniert super. In diesem Fall frontend.image
wird die zum Erstellen einer AngularJs-App verwendet. Zum Erstellen dieser Angular-App gehört auch die Installation von npm-Paketen, die die App benötigt.
Dieser Prozess, npm install, scheint lange zu dauern, 3 Minuten, npm installiert anscheinend jedes Mal jedes Paket.
Also habe ich ein Volume für meinen Slave hinzugefügt, es ist ein vom Host gemountetes Volume. Das Docker-Plugin verwendet dieses Volume jedes Mal, wenn es den Frontend-Container ausführt:
Der Benutzer, der den Befehl ausführt, npm install
ist jenkins
. npm speichert einen Cache, den Sie mit befehl npm config get cache
welche Ausgaben finden können/home/jenkins/.npm
Aus diesem Grund habe ich das Host-Volume /slaves/volumes/tsl.frontend:/home/jenkins
auf meinem Webcontainer-Slave gemountet.
Ich baue meine Angular-App mit einem Jenkins-Projekt, baue kein Problem, viele npm-Pakete sind installiert. Wenn ich in meinen Docker-Host ssh und cmd starte, ls /slaves/volumes/tsl.frontend
sehe ich viele npm-Pakete. Dies bedeutet, dass mein Host-Volume-Mount für den Slave funktioniert hat.
Jetzt erstelle ich das Jenkins-Projekt erneut. Npm installiert jedes einzelne Paket erneut, obwohl der Docker-Slave-Build-Container den Volume-Host-Mount verwendet. Ich kann dies sogar bestätigen, indem ich mit cmd, docker exec -it <some_clever_random_container_id> bash
cmd su jenkins
und cmd in den Slave-Container schlage, in npm cache ls
dem viele zwischengespeicherte npm-Pakete aufgelistet sind.
Selbst mit meinem Host-Mount-Volume, chmod 777
für das übrigens keine Berechtigungsprobleme bestehen, kann ich npm install
den Cache nicht verwenden.
In meinem Jenkins-Build, der den Docker-Slave-Container hochfährt, wird der erste Cmd ausgeführt, npm cache ls
und viele Pakete werden aufgelistet. Bedeutet dies nicht, dass mein Host-Volume wie erwartet funktioniert und der npm-Cache-Index die Integrität aufweist, auch wenn er nicht beschädigt ist?
Ich habe das reguläre npm install
cmd ausprobiert , das, wenn ich es auf meinem localhost-Rechner ausführe, beim ersten Mal alle Pakete und beim nächsten Mal fast keine Pakete installiert. Und auch der npm-Cache "Hack" npm --cache-min 9999999 install
, entnommen aus dieser SO-Antwort sowie cmdnpm --skip-installed --cache-min 9999999 install
Eine verwandte Frage wurde auf StackOverflow gestellt.
npm cache ls
und ein RAWls ~/.npm/* -al
in das Build-Skript selbst vor jedem anderen Build-Schritt einfügen, um den Zustand des Containers beim Starten des Builds sicherzustellen.Antworten:
Ich löste schließlich das von Docker Bildschicht Caching für die NPM installieren, folgende diese Antwort
Dies bedeutet, dass ich die npm-Installation aus dem Docker-Slave-Image in das eigentliche Frontend-Image verschoben habe. Hier ist meine letzte Docker-Datei, die die npm-Installation zwischen den Builds wirklich zwischenspeichert, wenn package.config keine Änderungen aufweist:
quelle
Sie können auch einen Nexus-Repository-Server einrichten, auf dem Sie Ihre npm-Module hosten und die externen proxen. Der Cache wird nicht genutzt, aber da sich die Ressourcen in Ihrem lokalen Netzwerk befinden oder sich möglicherweise im selben Schwarm befinden, sollte dies nicht so lange dauern.
quelle