I have a Docker image, let's call it frontend.image
, that I use for a Jenkins build slave. The Jenkins Docker plugin will spin up a container from this image and build artifacts inside the container. This all works great. In this case, the frontend.image
is used to build an AngularJs app. Part of building this Angular app is to install npm packages the app requires.
This process, npm install, seems to take a long time, 3 minutes it seems, npm always installs every package every time.
So I added a volume for my slave, it is a host mounted volume, the Docker plugin will use this volume every time it runs the frontend container:
The user that executes the command npm install
is jenkins
. npm keeps a cache which you can find with command npm config get cache
which outputs /home/jenkins/.npm
That is why I have the host volume /slaves/volumes/tsl.frontend:/home/jenkins
mounted to my web container slave.
I build my Angular app using a Jenkins project, builds no problem, many npm packages are installed. If ssh into my Docker host and run cmd ls /slaves/volumes/tsl.frontend
I see lots of npm packages. This means my host volume mount for the slave worked.
Now I build the Jenkins project again, npm installs every single package again, even though the Docker slave build container is using the volume host mount. I can even confirm by bashing into the slave container with cmd docker exec -it <some_clever_random_container_id> bash
then cmd su jenkins
then cmd npm cache ls
which lists many npm packages that are cached.
So, even with my host mount volume, which has permissions chmod 777
by the way so there is no permissions issues, I cannot get npm install
to use the cache.
I have tried the regular npm install
cmd, which, when I run on my localhost machine installs all the packages the first time and almost no packages the next time. And also the npm cache "hack" npm --cache-min 9999999 install
, taken from this SO answer as well as cmd npm --skip-installed --cache-min 9999999 install