Eine Spring Boot Anwendung im Docker-Container bauen

Februar 5, 2020

docker

1. Überblick

In diesem Artikel schauen wir uns an wie wir mit dem Maven Plugin docker-maven-plugin unsere Spring Boot Anwendung in den Docker Container verpacken und diesen dann ausführen. Mit dem Maven Plugin von fabric8 ist es ganz einfach aus der Spring Boot Anwendung ein Docker Image zu bauen, testen und über eine Continuous Delivery Pipeline zu deployen.

2. Maven Dependency

Als erstes fügen wir in unserer pom.xml das Maven Plugin docker-maven-plugin hinzu:

<plugin>
   <groupId>io.fabric8</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <configuration>
      <images>
         <image>
            <name>sample/dockerjava</name>
            <build>
               <contextDir>${project.basedir}</contextDir>
               <assembly>
                  <descriptorRef>artifact</descriptorRef>
               </assembly>
            </build>
         </image>
      </images>
   </configuration>
</plugin>


Wir konfigurieren das Plugin mit einer externen Dockerfile um den Container zu beschreiben. Dafür definieren wir im Element contextDir den Pfad zu der externen Dockerfile. In unserem Fall liegt die Dockerfile direkt neben der pom.xml, hierfür setzen wir  den contextDir auf ${project.basedir}. Über das Element assembly wird gesteuert, was gebaut werden soll und welche Dateien hinzugefügt sollen.


Vordefinierte Assembly Deskriptoren

  • artifact-with-dependencies fügt das Artefakt mit allen Dependencies hinzu.
  • artifact fügt das Artefakt ohne Dependencies hinzu. 
  • project fügt das ganze Maven Projekt ohne /target Verzeichnis hinzu.
  • rootWar fügt das Artefakt als ROOT.war hinzu.

Das Beispiel zeigt ausschließlich wie ein Docker Image gebaut wird, es ist aber auch möglich ein automatisches Ausführen des Containers im configuration Element zu konfigurieren um es zum Beispiel in Integration Tests einzubinden.   

3. Dockerfile

Im nächsten Schritt erstellen wir die Dockerfile und legen diese neben der pom.xml ab:

FROM openjdk:8-jre-alpine
COPY maven/*.jar /app.jar
EXPOSE 8080
CMD ["/usr/bin/java", "-jar", "-Dspring.profiles.active=default", "/app.jar"]

Für den Docker Containern verwenden wir das openjdk:8-jre-alpine Image, es enthält alles was wir benötigen um Java Anwendungen im Docker Container auszuführen. Unser Artefakt der Spring Boot Anwendung wird in den maven/ Ordner des Docker Containers hinzugefügt. Wir kopieren die Anwendung auf die Root Ebene und veranlassen in der letzten Zeile das Starten der Anwendung. Damit wir auch Zugriff von Außen auf die Anwendung haben, muss der Port 8080 exposed werden.  

4. Docker Container ausführen

Mit mvn docker:build wird der Container gebaut, hierbei wird in diesem Schritt unter target/docker/sample/dockerjava ein build/ Ordner generiert wo zum einen das Dockerfile zu finden ist und zum anderen das Artefakt der Spring Boot Anwendung. In dem tmp/ Ordner liegt das gebaute Docker Image mit unserer Spring Boot Anwendung.

Nach dem Bauen findet ihr über den Befehl docker images das fertige Image im Repository, anschließend könnt ihr es im Docker starten:

docker run -p 8080:8080 sample/dockerjava 

5. Fazit

Mit dem Maven Plugin von fabric8 lässt sich aus einer Spring Boot Anwendung ganz einfach ein Docker Container bauen, testen und ausführen. In diesem Artikel haben wir uns auf das Bauen konzentriert.  Wie ihr den gebauten Docker Container auf OpenShift deployen könnt, erfahrt ihr im nächsten Artikel.

> Eine Spring Boot Anwendung im Docker-Container nach OpenShift deployen

Source Code auf GitHub: https://github.com/softwarehandwerk/sample-docker-java-app

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}
>