Ho un'immagine Docker, chiamiamola frontend.image
, che uso per uno schiavo build Jenkins. Il plugin Jenkins Docker farà girare un contenitore da questa immagine e costruirà artefatti all'interno del contenitore. Tutto funziona alla grande. In questo caso, frontend.image
viene utilizzato per creare un'app AngularJs. Parte della creazione di questa app Angular è l'installazione dei pacchetti npm richiesti dall'app.
Questo processo, npm install, sembra richiedere molto tempo, 3 minuti sembra, npm installa sempre ogni pacchetto.
Quindi ho aggiunto un volume per il mio slave, è un volume montato sull'host, il plug-in Docker utilizzerà questo volume ogni volta che esegue il contenitore frontend:
L'utente che esegue il comando npm install
è jenkins
. npm mantiene una cache che puoi trovare con il comando npm config get cache
quali output/home/jenkins/.npm
Questo è il motivo per cui ho il volume host /slaves/volumes/tsl.frontend:/home/jenkins
montato sul mio web container slave.
Costruisco la mia app Angular usando un progetto Jenkins, non crea problemi, molti pacchetti npm sono installati. Se ssh nel mio host Docker ed ls /slaves/volumes/tsl.frontend
eseguo cmd vedo molti pacchetti npm. Ciò significa che il mio volume di montaggio host per lo slave ha funzionato.
Ora ricostruisco di nuovo il progetto Jenkins, npm installa di nuovo ogni singolo pacchetto, anche se il contenitore di compilazione dello schiavo Docker sta usando il mount dell'host di volume. Posso persino confermare cestinando nel contenitore slave con cmd docker exec -it <some_clever_random_container_id> bash
quindi cmd su jenkins
quindi cmd npm cache ls
che elenca molti pacchetti npm che sono memorizzati nella cache.
Quindi, anche con il mio volume di montaggio host, che ha le autorizzazioni chmod 777
a proposito quindi non ci sono problemi di autorizzazioni, non riesco npm install
a usare la cache.
Nella mia build Jenkins, che fa girare il contenitore slave Docker, il primo cmd che eseguo è npm cache ls
e sono elencati molti pacchetti, questo non significa che il mio volume host funziona come previsto e l'indice della cache npm ha integrità aka non corrotta?
Ho provato il normale npm install
cmd che, quando corro sul mio computer localhost, installa tutti i pacchetti la prima volta e quasi nessun pacchetto la prossima volta. E anche la cache npm "hack" npm --cache-min 9999999 install
, tratta da questa risposta SO e da cmdnpm --skip-installed --cache-min 9999999 install
Una domanda correlata è stata pubblicata su StackOverflow.
npm cache ls
raw ls ~/.npm/* -al
nello script di compilazione stesso prima di qualsiasi altro passaggio di compilazione solo per garantire lo stato del contenitore all'avvio della compilazione.