Dockerfiles mit Maven bauen
In der Vergangenheit wurde unter dem Deployment-Artefakt eines Entwicklungszyklus meist eine JAVA-Archive (JAR), eine Web-Archive (WAR) oder ein Enterprise-Archive (EAR) verstanden. Diese konnten in Verbindung mit Maven sehr einfach erzeugt und in ein zentrales Repository, wie einem Nexus oder Artifactory, abgelegt werden.
Während sich die Laufzeit-Umgebung immer mehr in Richtung Container-Systemen wie Docker und Kubernetes wandelt, müssen sich auch die notwendigen Deployment-Artefakte verändern.
Damit die gesamten Release- und Deployment Pipelines, welche in vielen Unternehmen bereits bestehen, nicht vollständig umgestellt werden müssen, eignet sich ein Blick auf das Dockerfile-Maven-Plugin.
Das Dockerfile-Maven-Plugin
Das Dockerfile-Maven-Plugin lässt sich mühelos in bestehende Maven-Pipelines einbinden und eignet sich für folgende Aufgaben:
- Erstellung von Docker-Container
- Taggen von Docker-Container
- Veröffentlichen der Docker-Container
Die aktuelle Version des Maven-Plugins ist 1.4.13 und kann wie folgt in Maven integriert werden:
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> </plugin>
Voraussetzung
Damit das Plugin einwandfrei verwendet werden kann, müssen folgende Voraussetzungen erfüllt werden:
- Docker Installation zum Bauen der Container
- Java 7 oder höher
- Apache Maven 3 oder höher
Einstieg in die Konfiguration
Nachfolgend wird die grundsätzliche Konfiguration anhand eines kleinem Beispiels erläutert. Die verschiedenen Konfigurationsmöglichkeiten werden daraufhin genauer erläutert.
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>philkuer/employee</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
Zunächst einmal wird definiert, dass die Goals Build (Bauen eines Dockerfiles) und Push (Veröffentlichen eines Dockerfiles) verwendet werden. Standmäßig werden diese Goals an die Phasen Package respektive Deploy des Maven Prozesses angefügt.
Darüber hinaus müssen weitere Information dem Plugin übermittelt werden:
- Ziel-Repository sowie Name des Images (Zeile 15)
- Der Tag für dieses Image, in diesem Fall die Versionsnummer der Projektes (Zeile 16)
- Argumente für das Dockerfile, wie beispielsweise die JAR-Datei (Zeile 17-19)
Das dazugehörige Dockerfile sieht in diesem Beispiel wie folgt aus und bezieht sich auf eine Spring-Boot Anwendung:
FROM openjdk:8-jdk-alpine EXPOSE 8080 ARG JAR_FILE COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Einen Container mehrfach Taggen
Die nachfolgende Konfiguration veranschaulicht dieses Vorgehen noch einmal:
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <executions> <execution> <id>build-image</id> <goals> <goal>build</goal> </goals> <phase>package</phase> <configuration> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </execution> <execution> <id>tag-image-latest</id> <goals> <goal>tag</goal> </goals> <configuration> <tag>latest</tag> </configuration> </execution> <execution> <id>tag-image-version</id> <goals> <goal>tag</goal> </goals> <configuration> <tag>${project.version}</tag> </configuration> </execution> <execution> <id>push-image-latest</id> <goals> <goal>push</goal> </goals> <phase>deploy</phase> <configuration> <tag>latest</tag> </configuration> </execution> <execution> <id>push-image-version</id> <goals> <goal>push</goal> </goals> <phase>deploy</phase> <configuration> <tag>${project.version}</tag> </configuration> </execution> </executions> <configuration> <repository>philkuer/gateway</repository> </configuration> </plugin>
Während im ersten Beispiel der Standard Prozess vom Dockerfile-Maven-Plugin verwendet wurden, müssen hier nun die verschiedenen Goals den jeweiligen Maven-Phasen selbstständig zugeordnet werden. Aus obiger Konfiguration ergibt sich somit folgender Prozess:
1. Bauen des Docker-Container2. Taggen des Container (Projekt-Version und Latest)
3. Jeden Tag veröffentlichen (Projekt-Version und Latest)
Für weitere Informationen bezüglich dieses Plugins eignet sich auch ein Blick auf die Dokumentation auf GitHub. Hier wird beispielsweise auch erläutert, wie eine eigene Registry angegeben werden kann und die Authentifizierung gegenüber dieser stattfindet sollte.
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare