Derzeit entwickeln oder akzeptieren wir keine neuen Funktionen oder beheben nicht einmal unkritische Fehler.
Dieses Maven-Plugin integriert Maven mit Docker.
Die Gestaltungsziele sind:
Dockerfile
erstellen Sie Docker-Projekte. Das ist es, was dieses Plugin verwendet. Sie sind obligatorisch.mvn package
eingeben, erhalten Sie ein Docker-Image. Wenn Sie mvn deploy
eingeben, wird Ihr Image gepusht.mvn dockerfile:build
und später mvn dockerfile:tag
und später mvn dockerfile:push
ohne Probleme eingeben. Dadurch entfällt auch die Notwendigkeit für etwas wie mvn dockerfile:build -DalsoPush
; Stattdessen können Sie einfach mvn dockerfile:build dockerfile:push
sagen.Dieses Projekt folgt dem Open Code of Conduct. Durch Ihre Teilnahme wird von Ihnen erwartet, dass Sie diesen Kodex respektieren.
Eine Liste der Veröffentlichungen finden Sie im Änderungsprotokoll
Dieses Plugin erfordert Java 7 oder höher und Apache Maven 3 oder höher (dockerfile-maven-plugin <=1.4.6 benötigt Maven >= 3 und in anderen Fällen Maven >= 3.5.2). Um die Integrationstests durchzuführen oder das Plugin in der Praxis nutzen zu können, ist ein funktionierendes Docker-Setup erforderlich.
Weitere Beispiele finden Sie im Integrationstestverzeichnis.
Der erweiterte Test zeigt insbesondere einen vollständigen Service, der aus zwei Mikrodiensten besteht, die mithilfe von helios-testing
auf Integration getestet werden.
Dadurch wird das eigentliche Plugin konfiguriert, um Ihr Image mit mvn package
zu erstellen und es mit mvn deploy
zu pushen. Natürlich können Sie mvn dockerfile:build
auch explizit sagen.
< plugin >
< groupId >com.spotify</ groupId >
< artifactId >dockerfile-maven-plugin</ artifactId >
< version >${dockerfile-maven-version}</ version >
< executions >
< execution >
< id >default</ id >
< goals >
< goal >build</ goal >
< goal >push</ goal >
</ goals >
</ execution >
</ executions >
< configuration >
< repository >spotify/foobar</ repository >
< tag >${project.version}</ tag >
< buildArgs >
< JAR_FILE >${project.build.finalName}.jar</ JAR_FILE >
</ buildArgs >
</ configuration >
</ plugin >
Eine entsprechende Dockerfile
könnte so aussehen:
FROM openjdk:8-jre
MAINTAINER David Flemström <[email protected]>
ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/myservice/myservice.jar"]
# Add Maven dependencies (not shaded into the artifact; Docker-cached)
ADD target/lib /usr/share/myservice/lib
# Add the service itself
ARG JAR_FILE
ADD target/${JAR_FILE} /usr/share/myservice/myservice.jar
Wichtiger Hinweis
Der Maven-artigeste Weg, auf das Build-Artefakt zu verweisen, wäre wahrscheinlich die Verwendung der Variable project.build.directory
zum Verweisen auf das „Ziel“-Verzeichnis. Allerdings ergibt sich dadurch ein absoluter Pfad, der vom ADD-Befehl im Dockerfile nicht unterstützt wird. Jede solche Quelle muss sich im Kontext des Docker-Builds befinden und daher durch einen relativen Pfad referenziert werden. Siehe #101
Verwenden Sie ${project.build.directory}
nicht als Referenz auf Ihr Build-Verzeichnis.
Die Verwendung dieses Plugins für Ihre Builds bietet viele Vorteile.
Mit diesem Plugin können Sie den Docker-Cache konsistenter nutzen und Ihre Builds erheblich beschleunigen, indem Sie Maven-Abhängigkeiten in Ihrem Image zwischenspeichern können. Außerdem empfiehlt es sich, das maven-shade-plugin
zu meiden, das die Erstellung ebenfalls erheblich beschleunigt.
Sie müssen nicht mehr so etwas sagen wie:
mvn package
mvn dockerfile:build
mvn verify
mvn dockerfile:push
mvn deploy
Stattdessen reicht es einfach zu sagen:
mvn deploy
Mit der Grundkonfiguration wird dadurch sichergestellt, dass das Image zum richtigen Zeitpunkt erstellt und gepusht wird.
Sie können sich auf die Docker-Informationen eines anderen Projekts verlassen, da dieses Plugin beim Erstellen von Docker-Images Projektmetadaten anhängt. Fügen Sie einfach diese Informationen zu jedem Projekt hinzu:
< dependency >
< groupId >com.spotify</ groupId >
< artifactId >foobar</ artifactId >
< version >1.0-SNAPSHOT</ version >
< type >docker-info</ type >
</ dependency >
Jetzt können Sie Informationen zum Docker-Image des Projekts lesen, von dem Sie abhängig waren:
String imageName = getResource ( "META-INF/docker/com.spotify/foobar/image-name" );
Dies eignet sich hervorragend für einen Integrationstest, bei dem Sie die neueste Version des Docker-Images eines anderen Projekts benötigen.
Beachten Sie, dass Sie eine Maven-Erweiterung in Ihrem POM (oder einem übergeordneten POM) registrieren müssen, damit der docker-info
-Typ unterstützt wird:
< build >
< extensions >
< extension >
< groupId >com.spotify</ groupId >
< artifactId >dockerfile-maven-extension</ artifactId >
< version >${version}</ version >
</ extension >
</ extensions >
</ build >
Ihr(e) Projekt(e) sehen so aus:
a/
Dockerfile
pom.xml
b/
Dockerfile
pom.xml
Sie können diese Projekte jetzt mit Fig oder Docker-Compose oder einem anderen System verwenden, das mit Dockerfiles arbeitet. Eine docker-compose.yml
könnte beispielsweise so aussehen:
service-a :
build : a/
ports :
- ' 80 '
service-b :
build : b/
links :
- service-a
Jetzt funktionieren docker-compose up
und docker-compose build
wie erwartet.
Siehe Nutzungsdokumente.
Siehe Authentifizierungsdokumente.
So kürzen Sie die Maven-Version:
mvn clean [-B -Dinvoker.skip -DskipTests -Darguments='-Dinvoker.skip -DskipTests']
-Dgpg.keyname=<key ID used for signing artifacts>
release:clean release:prepare release:perform
Wir verwenden gren
um Releases in Github zu erstellen:
gren release