Tengo una imagen de Docker, llamémosla frontend.image
, que uso para un esclavo de compilación Jenkins. El complemento Jenkins Docker hará girar un contenedor a partir de esta imagen y creará artefactos dentro del contenedor. Todo esto funciona muy bien. En este caso, frontend.image
se usa para construir una aplicación AngularJs. Parte de la construcción de esta aplicación Angular es instalar paquetes npm que la aplicación requiere.
Este proceso, npm install, parece tomar mucho tiempo, parece que 3 minutos, npm siempre instala todos los paquetes cada vez.
Así que agregué un volumen para mi esclavo, es un volumen montado en el host, el complemento Docker usará este volumen cada vez que ejecute el contenedor frontend:
El usuario que ejecuta el comando npm install
es jenkins
. npm mantiene un caché que puede encontrar con el comando npm config get cache
que genera/home/jenkins/.npm
Es por eso que tengo el volumen del host /slaves/volumes/tsl.frontend:/home/jenkins
montado en mi contenedor web esclavo.
Construyo mi aplicación Angular usando un proyecto Jenkins, construye sin problemas, se instalan muchos paquetes npm. Si ssh en mi host Docker y ejecuta cmd ls /slaves/volumes/tsl.frontend
, veo muchos paquetes npm. Esto significa que mi montaje de volumen de host para el esclavo funcionó.
Ahora vuelvo a compilar el proyecto Jenkins, npm instala cada paquete nuevamente, a pesar de que el contenedor de compilación esclavo Docker está utilizando el montaje de host de volumen. Incluso puedo confirmar golpeando en el contenedor esclavo con cmd, docker exec -it <some_clever_random_container_id> bash
luego cmd y su jenkins
luego cmd, npm cache ls
que enumera muchos paquetes npm que se almacenan en caché.
Entonces, incluso con mi volumen de montaje de host, que tiene permisos chmod 777
por cierto, por lo que no hay problemas de permisos, no puedo npm install
usar el caché.
En mi compilación Jenkins, que hace girar el contenedor esclavo Docker, el primer cmd que ejecuto es npm cache ls
y se enumeran muchos paquetes, ¿no significa esto que mi volumen de host funciona como se esperaba y que el índice de caché npm tiene integridad también conocida como no está dañada?
He probado el npm install
cmd normal , que, cuando ejecuto en mi máquina localhost, instala todos los paquetes la primera vez y casi ningún paquete la próxima vez. Y también el "hack" de caché npm npm --cache-min 9999999 install
, tomado de esta respuesta SO así como cmdnpm --skip-installed --cache-min 9999999 install
Se publicó una pregunta relacionada en StackOverflow.
npm cache ls
y un rawls ~/.npm/* -al
en el script de compilación en sí mismo antes de cualquier otro paso de compilación solo para asegurar el estado del contenedor al iniciar la compilación.Respuestas:
Finalmente resolví esto usando el almacenamiento en caché de la capa de imagen de Docker para la instalación de npm, siguiendo esta respuesta
Esto significa que moví la instalación de npm fuera de la imagen esclava de Docker y la coloqué en la imagen de la interfaz, aquí está mi archivo Docker final que realmente almacena en caché la instalación de npm entre compilaciones si package.config no tiene cambios:
fuente
Otro enfoque que puede hacer es configurar un servidor de repositorio nexus donde aloje sus módulos npm y proxy los externos. No aprovecha el caché, pero debido a que los recursos están dentro de su red local o tal vez en el mismo enjambre, no debería tomar tanto tiempo.
fuente