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.image
sł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 install
to jenkins
. npm utrzymuje pamięć podręczną, którą można znaleźć za pomocą polecenia, npm config get cache
które dane wyjściowe/home/jenkins/.npm
Dlatego mam wolumin hosta /slaves/volumes/tsl.frontend:/home/jenkins
podłą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> bash
a następnie cmd, su jenkins
a następnie cmd, npm cache ls
który zawiera listę wielu pakietów npm, które są buforowane.
Więc nawet z moim woluminem montowania hosta, który ma chmod 777
przy okazji uprawnienia , więc nie ma problemów z uprawnieniami, nie mogę npm install
użyć pamięci podręcznej.
W mojej kompilacji Jenkins, która obraca kontener Docker slave, uruchomiłem pierwsze polecenie cmd npm cache ls
i 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 install
cmd, 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 ls
i rawls ~/.npm/* -al
w samym skrypcie kompilacji przed jakimkolwiek innym krokiem kompilacji, aby zapewnić stan kontenera podczas uruchamiania kompilacji.Odpowiedzi:
W końcu rozwiązałem ten problem, używając buforowania warstwy obrazu Docker dla instalacji npm, zgodnie z tą odpowiedzią
Oznacza to, że przeniosłem instalację npm z obrazu podrzędnego Docker do rzeczywistego obrazu interfejsu użytkownika, oto mój ostateczny plik Docker, który naprawdę buforuje instalację npm między kompilacjami, jeśli pakiet.config nie ma zmian:
źródło
Innym podejściem, jakie możesz zrobić, jest skonfigurowanie serwera repozytorium nexus, na którym hostujesz swoje moduły npm i proxy zewnętrzne. Nie wykorzystuje pamięci podręcznej, ale ponieważ zasoby znajdują się w sieci lokalnej lub w tym samym roju, nie powinno to zająć tak długo.
źródło