Mam obraz Dockera, nazwijmy go frontend.image, którego używam dla kompilatora Jenkins. Wtyczka Jenkins Docker rozdzieli pojemnik z tego obrazu i zbuduje artefakty wewnątrz kontenera. To wszystko działa świetnie. W tym przypadku frontend.imagesłuży do zbudowania aplikacji AngularJs. Częścią budowy tej aplikacji Angular jest instalacja pakietów npm wymaganych przez aplikację.
Wydaje się, że ten proces, npm install, zajmuje dużo czasu, wydaje się, że 3 minuty, npm zawsze instaluje każdy pakiet za każdym razem.
Więc dodałem wolumin dla mojego urządzenia podrzędnego, jest to wolumin zamontowany na hoście, wtyczka Docker będzie używać tego woluminu za każdym razem, gdy uruchamia kontener frontonu:
Użytkownik wykonujący polecenie npm installto jenkins. npm utrzymuje pamięć podręczną, którą można znaleźć za pomocą polecenia, npm config get cachektóre dane wyjściowe/home/jenkins/.npm
Dlatego mam wolumin hosta /slaves/volumes/tsl.frontend:/home/jenkinspodłączony do mojego slave kontenera WWW.
Buduję moją aplikację Angular przy użyciu projektu Jenkins, nie buduje żadnego problemu, zainstalowanych jest wiele pakietów npm. Jeśli ssh na moim hoście Docker i uruchom cmd ls /slaves/volumes/tsl.frontend, widzę wiele pakietów npm. Oznacza to, że działało podłączenie woluminu mojego hosta dla urządzenia slave.

Teraz ponownie buduję projekt Jenkins, npm ponownie instaluje każdy pakiet, nawet jeśli kontener kompilacji podrzędnej Docker korzysta z podłączenia hosta woluminu. Mogę nawet potwierdzić, uderzając w kontener podrzędny za pomocą cmd, docker exec -it <some_clever_random_container_id> basha następnie cmd, su jenkinsa następnie cmd, npm cache lsktóry zawiera listę wielu pakietów npm, które są buforowane.

Więc nawet z moim woluminem montowania hosta, który ma chmod 777przy okazji uprawnienia , więc nie ma problemów z uprawnieniami, nie mogę npm installużyć pamięci podręcznej.
W mojej kompilacji Jenkins, która obraca kontener Docker slave, uruchomiłem pierwsze polecenie cmd npm cache lsi wymieniono wiele pakietów, czy to nie oznacza, że wolumin hosta działa zgodnie z oczekiwaniami, a indeks pamięci podręcznej npm ma integralność, czyli nie jest uszkodzony?
Próbowałem zwykłego npm installcmd, który, kiedy uruchamiam na moim komputerze lokalnym, instaluje wszystkie pakiety za pierwszym razem i prawie żadnych pakietów za następnym razem. A także „hack” pamięci podręcznej npm npm --cache-min 9999999 install, wzięty z tej odpowiedzi SO oraz cmdnpm --skip-installed --cache-min 9999999 install
Podobne pytanie zostało opublikowane na StackOverflow.
npm cache lsi raw ls ~/.npm/* -alw samym skrypcie kompilacji przed jakimkolwiek innym krokiem kompilacji, aby zapewnić stan kontenera podczas uruchamiania kompilacji.

