J'ai une image Docker, appelons-la frontend.image, que j'utilise pour un esclave de génération Jenkins. Le plugin Jenkins Docker fera tourner un conteneur à partir de cette image et construira des artefacts à l'intérieur du conteneur. Tout cela fonctionne très bien. Dans ce cas, le frontend.imageest utilisé pour créer une application AngularJs. Une partie de la construction de cette application angulaire consiste à installer les packages npm requis par l'application.
Ce processus, l'installation de npm, semble prendre beaucoup de temps, il semble que 3 minutes, npm installe toujours chaque paquet à chaque fois.
J'ai donc ajouté un volume pour mon esclave, c'est un volume monté sur l'hôte, le plugin Docker utilisera ce volume à chaque fois qu'il exécutera le conteneur frontal:
L'utilisateur qui exécute la commande npm installest jenkins. npm conserve un cache que vous pouvez trouver avec une commande npm config get cachequi génère/home/jenkins/.npm
C'est pourquoi j'ai le volume hôte /slaves/volumes/tsl.frontend:/home/jenkinsmonté sur mon esclave de conteneur Web.
Je crée mon application Angular à l'aide d'un projet Jenkins, ne génère aucun problème, de nombreux packages npm sont installés. Si ssh dans mon hôte Docker et exécute cmd, ls /slaves/volumes/tsl.frontendje vois beaucoup de packages npm. Cela signifie que le volume de mon hôte pour l'esclave a fonctionné.

Maintenant, je reconstruis le projet Jenkins, npm installe à nouveau chaque package, même si le conteneur de construction esclave Docker utilise le montage hôte de volume. Je peux même confirmer en bashing dans le conteneur esclave avec cmd docker exec -it <some_clever_random_container_id> bashpuis cmd su jenkinspuis cmd npm cache lsqui répertorie de nombreux packages npm qui sont mis en cache.

Donc, même avec mon volume de montage hôte, qui a d'ailleurs des autorisations chmod 777donc il n'y a pas de problèmes d'autorisations, je ne peux pas npm installutiliser le cache.
Dans ma build Jenkins, qui fait tourner le conteneur esclave Docker, le premier cmd que j'exécute est npm cache lset de nombreux packages sont répertoriés, cela ne signifie-t-il pas que mon volume hôte fonctionne comme prévu et que l'index de cache npm a l'intégrité aka non corrompu?
J'ai essayé la npm installcmd régulière , qui, lorsque j'exécute sur ma machine localhost, installe tous les packages la première fois et presque aucun package la prochaine fois. Et aussi le cache npm "hack" npm --cache-min 9999999 install, tiré de cette réponse SO ainsi que cmdnpm --skip-installed --cache-min 9999999 install
Une question connexe a été publiée sur StackOverflow.
npm cache lset un brut ls ~/.npm/* -aldans le script de build lui-même avant toute autre étape de build juste pour assurer l'état du conteneur au démarrage de la build.

