Neuigkeiten von trion.
Immer gut informiert.

Java Docker Image mit Jib auf Raspberry Pi / ARM

Jib eignet sich sehr gut, um Docker Images mit Maven oder Gradle zu erzeugen, ohne dass dazu ein Docker Daemon verwendet werden muss. Im Gegensatz zu Docker unterstützt Jib derzeit noch keine Multi-Arch Images. Damit ist ein automatischer Build für die jeweilige Plattform nicht möglich, was sich zum Beispiel auf einem Raspberry Pi, ODROID oder anderen Maschinen auf Basis der ARM Architektur bemerkbar macht.

Mit einer kleinen Konfigurationsanpassung ist es jedoch möglich, passende Images zu erzeugen.

Prinzipiell gibt es zwei Herausforderungen zu meistern, um Java Container Images mit Jib auf einer anderen Architektur als dem Standard, amd64, zu bauen: 1. Das richtige Base Image muss verwendet werden 2. Beim Push in eine Docker Registry oder Container Registry muss das Zielimage so genannt, sein, dass es später auch korrekt zur Architektur zugeordnet wird

Für letzteres gibt es noch die Möglichkeit, entsprechende Manifeste anzulegen, die eine Zuordnung von Docker Image zu ARM, ARM64 und amd64 Architektur ermöglichen. (Oder sogar noch in Kombination mit dem jeweiligen Betriebssystem…​)

Im simpelsten Fall gilt es lediglich das korrekte Base-Image bei Jib zu konfigurieren. Bei Raspberry Pi 4 könnte das ARMv7 (32 bit) oder ARMv8 64 bit sein. Die Architektur lässt sich manuell mit dem Linux Kommando uname -a feststellen.

Jib verwendet bei Maven oder Gradle Builds normalerweise das von Google gepflegte Distroless-Java Docker Image als Base Image für den Container. Aktuell stellt Google das Container Image nur für amd64 bereit.
Stattdessen kann das OpenJDK Image explizit angewählt werden, dass es auch für ARM und ARM64 gibt. Auch wenn es das OpenJDK Docker Image als Multi-Arch Image auf DockerHub gibt, ist Jib leider nicht in der Lage mit diesen umzugehen.

Daher ist explizit das Architekturspezifische Base Image in Jib zu konfigurieren, z.B. arm64v8/openjdk:11-slim für ARM64.

Eine Konfiguration in der Maven pom.xml zum Build auf einem Arm64 Raspberry Pi 4 oder ODROID ist im folgenden zu sehen.

Ausschnitt aus der pom.xml mit ARM64 Build
<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>1.8.0</version>
  <configuration>
    <from>
      <!-- <image>gcr.io/distroless/java:11</image> -->
      <image>arm64v8/openjdk:11-slim</image>
    </from>
    <to>
      <image>registry.ziel/arm64/spring:${container.image.version}</image>
    </to>
    <container>
      <ports>8080</ports>
    </container>
    <skip>false</skip>
  </configuration>
</plugin>

Als Ziel-Image ist zu sehen, dass sich im Registry Pfad explizit die Architektur des Images findet. Da jede Firma eigene Konventionen zur Versionierung verwendet, muss dies natürlich entsprechend angepasst werden.




Zu den Themen Kubernetes, Docker und Cloud Architektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Zur Desktop Version des Artikels