Dockerfiles mit Maven bauen

Docker_Maven_Blog

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

In vielen Fällen wird ein Docker-Container mit mehr als nur einem Tag versehen. Damit allerdings für jeden Tag nicht der gesamte Docker- Container neugebaut werden muss, empfiehlt es sich die beiden Prozesse (Build und Taggen) voneinander zu trennen.

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-Container
2. 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. 

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Gäste
Sonntag, 08. Dezember 2019

Sicherheitscode (Captcha)