Eu tenho uma imagem do Docker, vamos chamá-la frontend.image
, que eu uso para um Jenkins build slave. O plug - in Jenkins Docker girará um contêiner nesta imagem e criará artefatos dentro do contêiner. Tudo isso funciona muito bem. Nesse caso, o frontend.image
é usado para criar um aplicativo AngularJs. Parte da criação desse aplicativo Angular é instalar os pacotes npm necessários.
Esse processo, npm install, parece levar muito tempo, 3 minutos, o npm sempre instala todos os pacotes todas as vezes.
Então, adicionei um volume para o meu escravo, é um volume montado no host, o plug-in do Docker usará esse volume sempre que executar o contêiner de front-end:
O usuário que executa o comando npm install
é jenkins
. O npm mantém um cache que você pode encontrar com o comando npm config get cache
que gera/home/jenkins/.npm
É por isso que tenho o volume do host /slaves/volumes/tsl.frontend:/home/jenkins
montado no meu escravo de contêiner da web.
Eu construo meu aplicativo Angular usando um projeto Jenkins, não cria nenhum problema, muitos pacotes npm estão instalados. Se o ssh no meu host do Docker e executar o cmd ls /slaves/volumes/tsl.frontend
, vejo muitos pacotes npm. Isso significa que o volume do meu host montado para o escravo funcionou.
Agora, construo o projeto Jenkins novamente, o npm instala todos os pacotes novamente, mesmo que o contêiner de construção escravo do Docker esteja usando a montagem do host de volume. Posso até confirmar baseando-me no contêiner escravo com cmd docker exec -it <some_clever_random_container_id> bash
, cmd su jenkins
e cmd, npm cache ls
que lista muitos pacotes npm armazenados em cache.
Portanto, mesmo com o volume de montagem do host, que possui permissões chmod 777
a propósito, para que não haja problemas de permissões, não consigo npm install
usar o cache.
Na minha compilação Jenkins, que gira o contêiner escravo do Docker, o primeiro cmd que eu executo é npm cache ls
e muitos pacotes estão listados, isso não significa que o volume do meu host está funcionando conforme o esperado e o índice de cache npm tem integridade, ou seja, não está corrompida?
Eu tentei o npm install
cmd normal , que, quando eu executo na minha máquina localhost, instala todos os pacotes na primeira vez e quase nenhum pacote na próxima vez. E também o cache npm "hack" npm --cache-min 9999999 install
, extraído dessa resposta do SO e do cmdnpm --skip-installed --cache-min 9999999 install
Uma pergunta relacionada foi publicada no StackOverflow.
npm cache ls
e um rawls ~/.npm/* -al
no próprio script de compilação antes de qualquer outra etapa da compilação apenas para garantir o estado do contêiner ao iniciar a compilação.Respostas:
Finalmente resolvi isso usando o cache da camada de imagem do Docker para a instalação do npm, seguindo esta resposta
Isso significa que movi a instalação do npm para fora da imagem escrava do Docker e para a imagem realmente front-end, eis o meu arquivo final do Docker que realmente armazena em cache a instalação do npm entre as compilações, se package.config não tiver alterações:
fonte
Outra abordagem que você pode fazer é configurar um servidor de repositório nexus no qual hospede seus módulos npm e faça proxy dos externos. Ele não utiliza o cache, mas como os recursos estão dentro da sua rede local ou talvez no mesmo enxame, não deve demorar tanto tempo.
fonte