2016-02-01 5 views
6

Ich baue ein Docker-Bild von dieser Dockerfile:Caching Jar Abhängigkeiten für Maven-basierte Docker baut

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"] 

Mit diesem Dockerfile, ich zwinge die Abhängigkeiten herunterladen, bevor mein Java-Projekt Verpackung. Daher muss ich die Abhängigkeiten nicht jedes Mal neu herunterladen, wenn ich eine Datei aus meinem src-Verzeichnis ändere.

Aber es gibt ein Problem und dieses Problem hängt von der Version von Maven (Basisbild) ab. Tatsächlich werden die Abhängigkeiten heruntergeladen, aber sie werden nicht im Verzeichnis ~/.m2 des Containers gespeichert. Es ist leer. Wenn ich also eine Quelldatei ändere, werden alle Abhängigkeiten neu heruntergeladen.

Allerdings habe ich festgestellt, dass, wenn ich die Version von Maven aus dem Basisbild (zum Beispiel FROM maven:3.2.5-jdk-8) ändern, es funktioniert.

Sehr seltsam, nicht wahr?

Antwort

1

Ich fürchte, es wegen dieser VOLUME Anweisung ist sie hinzugefügt haben:

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

Es macht /root/.m2 ein Volumen und damit alle Änderungen an diesem Ordner von Build-Schritten sind nicht auf die gebracht folgende Build-Container.

+0

Gestartet eine frühere Version ohne die '.m2' Lautstärke mit und es funktioniert –

+0

Hier ist ein Problem, verschiedene Menschen Beschwerden über Tracking, wie die' VOLUME' Anweisung funktioniert: https://github.com/docker/docker/issues/3639 # issuecomment-229490630 – sirlatrom

2

Es gibt eine neue Anweisung zu diesem Thema: https://github.com/carlossg/docker-maven#packaging-a-local-repository-with-the-image

Die $ MAVEN_CONFIG dir (Standard /root/.m2) als Volumen konfiguriert ist, so etwas gibt es bei der Erstellung in einem Dockerfile kopiert ist hat verloren. Dafür wird das Verzeichnis/usr/share/maven/ref/erstellt, und alles, was dort drin ist, wird beim Start des Containers nach $ MAVEN_CONFIG kopiert.

Um ein vorverpacktes Repository zu erstellen, erstellen Sie eine pom.xml mit den Abhängigkeiten, die Sie benötigen, und verwenden Sie diese in Ihrer Dockerfile. /usr/share/maven/ref/settings-docker.xml ist eine Einstellungsdatei, die das lokale Repository in/usr/share/maven/ref/repository ändert. Sie können jedoch Ihre eigene Einstellungsdatei verwenden, solange sie/usr verwendet/share/maven/ref/repository als lokales Repo.

+1

Dieses sorta funktioniert, hat aber Einschränkungen, eine davon ist, dass die Auflösung von Abhängigkeiten vor der Hand nicht immer alle herunterlädt: [Go-offline findet Modulabhängigkeiten nicht in Multi-Modul Build.] (Https: //issues.apache.org/jira/browse/MDEP-516) –

+1

Ich fand auch, dass die Angabe des lokalen Repos wie 'mvn install -Dmaven.repo.local =/usr/share/maven/ref/repository' schneller ist es nicht tun 'mvn installieren'. Ich bin nicht sicher, warum dies der Fall ist, da es scheint, dass das offizielle Docker-Maven-Bild das lokale Repository konfiguriert. Wie auch immer, das sind meine 2 Cent. –

Verwandte Themen