2016-02-01 14 views
6

Sto costruendo un'immagine Docker da questo Dockerfile:caching dipendenze Jar per Maven a base di Docker costruisce

FROM maven:3.3.3-jdk-8 
MAINTAINER Mickael BARON 

ADD pom.xml /work/pom.xml 
WORKDIR /work 
RUN mvn dependency:go-offline --fail-never 

ADD ["src", "/work/src"] 
RUN ["mvn", "package"] 

Con questo Dockerfile, forzo per scaricare le dipendenze prima del confezionamento mio progetto Java. Quindi, non devo scaricare di nuovo le dipendenze ogni volta che ho cambiato un file dalla mia directory src.

Ma, c'è un problema e questo problema dipende dalla versione di Maven (immagine di base). In effetti, le dipendenze vengono scaricate ma non vengono mantenute nella directory ~/.m2 del contenitore. È vuoto. Quindi, quando cambio qualche file sorgente, tutte le dipendenze vengono riscaricate.

Tuttavia, ho notato che se cambio la versione di Maven dall'immagine di base (ad esempio FROM maven:3.2.5-jdk-8), funziona.

Molto strano, non è vero?

risposta

1

ho paura che a causa di questo VOLUME istruzione hanno aggiunto:

https://github.com/carlossg/docker-maven/blame/8ab542b907e69c5269942bcc0915d8dffcc7e9fa/jdk-8/Dockerfile#L11

Rende /root/.m2 un volume e, quindi, eventuali modifiche a tale cartella fatta da istruzioni di generazione non sono portati al seguenti contenitori di costruzione.

+0

iniziato a utilizzare una versione precedente, senza il volume '.m2' e funziona –

+0

Ecco un problema di monitoraggio denunce di varie persone su come funziona l'istruzione' volumico: https://github.com/docker/docker/issues/3639 # issuecomment-229490630 – sirlatrom

2

C'è una nuova istruzione su questo argomento: https://github.com/carlossg/docker-maven#packaging-a-local-repository-with-the-image

Il $ MAVEN_CONFIG dir (default a /root/.m2) è configurato come un volume quindi tutto copiato lì in un Dockerfile in fase di compilazione è perduto. Per questo viene creato il dir/usr/share/maven/ref/e tutto ciò che è contenuto verrà copiato all'avvio del contenitore in $ MAVEN_CONFIG.

Per creare un repository preconfezionato, creare un pom.xml con le dipendenze necessarie e utilizzarlo nel file Docker. /usr/share/maven/ref/settings-docker.xml è un file di impostazioni che modifica il repository locale in/usr/share/maven/ref/repository, ma puoi utilizzare il tuo file di impostazioni purché utilizzi/usr/share/maven/ref/repository come repository locale.

+1

Questo genere funziona ma presenta delle limitazioni, una delle quali è che risolvendo le dipendenze prima che la mano non le scarichi sempre tutte: [Go-offline non trova le dipendenze dei moduli nella build di più moduli.] (Https: //issues.apache.org/jira/browse/MDEP-516) –

+1

Ho anche scoperto che specificare il repository locale come 'mvn install -Dmaven.repo.local =/usr/share/maven/ref/repository' è più veloce di non farlo 'mvn install'. Non sono sicuro del motivo per cui questo è il caso, dal momento che sembra che l'immagine ufficiale di docker-maven configuri il repository locale. Ad ogni modo, quelli sono i miei 2 centesimi. –

Problemi correlati