post-image

Multi-Architecture Builds und Images mit Docker


Dass ARM-Prozessoren nicht nur für Smartphones und Tablets zu gebrauchen sind, ist spätestens mit der Verfügbarkeit von ARM-basierten Servern bei AWS offensichtlich. Dazu kommt, dass auch der Siegeszug des Raspberry Pis und anderer günstiger ARM-basierter Entwicklerboards es immer häufiger erforderlich macht, bestehende Anwendungen auch für andere Prozessorarchitekturen als amd64 bereitzustellen. Um dieses Problem anzugehen bietet Docker die Möglichkeit Images für verschiede Architekturen zu bauen und unter dem gleichen Tag in einer Docker Registry zu veröffentlichen.

Multi-Arch Images für Debian

Vorbedingungen

Um die im Folgenden gezeigten Funktionen von Docker nutzen zu können müssen die experimentellen Features des Docker CLI aktiviert werden. Dies gilt sowohl für die lokale Entwicklung, als auch für die Ausführung auf einem Build-Server.

Hinweis: Da die entsprechende Information für Docker for Windows bzw. Docker for Mac in der verlinkten README fehlen: Hier können die experimentellen Features im UI unter Command Line -> Enable experimental features aktiviert werden.

Enable experimental features in Docker Desktop

Wir bauen ein Multi-Arch Image

Für alles Nachfolgende benötigen wir ein Image, das wir für mehrere Prozessorarchitekturen bauen können. Alpine oder Debian Linux sind gute Ausgangskandidaten, da beide bereits Basisimages für diverse Architekturen bereitstellen. Um die verschiedenen Architekturen zu zeigen nutzten wir das schlankere Alpine Linux, führen beim Start des Containers ein echo-Kommando aus und lassen uns die Architektur des Betriebssystems ausgeben.

FROM alpine:3.11

CMD ["/bin/sh", "-c", "echo the current OS architecture is: $(uname -m)"]

Das Image mit Docker buildx bauen

Unter Linux muss buildx separat installiert werden. In Docker for Mac sowie Docker for Windows ist buildx bereits enthalten

Initial (vor der ersten Nutzung von buildx) muss ein Driver Container erstellt werden:

docker buildx create --use

Nun kann der Container für die gewünschten Zielarchitekturen gebaut werden:

docker buildx build --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag lion5/echo-arch:latest --push .

buildx erstellt dabei vollkommend transparent das notwendige Docker Manifest um die unterschiedlichen Docker Images unter dem gleichen Tag in einer Docker Registry zu veröffentlichen. buildx build akzeptiert außerdem mehrere --tag Parameter, d.h. es ist problemlos möglich zu einem Stand auch gleich das entsprechende latest Tag zu updaten.

Lokales Testen

Um ein Image für eine bestimmte Plattform lokal zu testen kann dieses einfach mithilfe des --load Arguments in die lokale Docker Registry geladen werden. Anschließend könnt ihr, wie gewohnt, das Image mit docker run ausführen.

Zu beachten ist hierbei, dass bei der Verwendung von --load immer nur eine Prozessorarchitektur bei --plattform angegeben werden darf (siehe https://github.com/docker/buildx/issues/59).

docker buildx build --platform linux/arm64/v8 --load --tag lion5/echo-arch .

docker run --rm lion5/echo-arch

Fazit

Dank buildx ist das Erstellen von Mulit-Arch Images inzwischen kein Hexenwerk mehr und innerhalb kurzer Zeit zu bewerkstelligen. Gerade für Experimente mit RaspberryPis oder die neuen AWS ARM-Server Instanzen bietet sich diese Technologie hervorragend an.

Zu beachten ist dabei, dass sich buildx immer noch in der Tech-Preview-Phase befindet

* Quelle Titelbild: https://www.docker.com/company/newsroom/media-resources

Zurück