Multi-Platform-Builds

Docker für Fortgeschrittene

Mike Metzger

Data Engineering Consultant

Multi-Platform?

  • Was bedeutet Multi-Platform?
    • Verschiedene Betriebssysteme
      • linux
      • windows
      • macos
    • Verschiedene CPU-Typen
      • x64_64 oder amd64
      • arm64
      • arm7
  • Üblich als os/cpu angegeben, z. B. linux/amd64

Linux-Tux-Logo

AMD64-Logo

ARM-Logo

Docker für Fortgeschrittene

Multi-Platform-Builds erstellen

  • Baut auf dem Verhalten von Multi-Stage-Builds auf
  • Die erste/Build-Stage nutzt oft Cross-Compiler und hängt von der Architektur des Hostsystems ab
  • Die finale Stage nutzt Architektur/OS des Zielsystems
Docker für Fortgeschrittene

Multi-Platform-Dockerfile-Optionen

  • Die Build-Stage nutzt das Flag --platform=$BUILDPLATFORM
    • $BUILDPLATFORM steht für die Plattform des Hosts, der den Build ausführt
  • Nutzt teils die Direktive ARG
    • Übergibt lokale Umgebungsvariablen an das Docker-Build-System
    • Hier: TARGETOS und TARGETARCH
    • ARG TARGETOS TARGETARCH
    • Die Umgebungsvariablen auf Host-Ebene können vorher definiert oder mit dem Befehl env gesetzt werden.
Docker für Fortgeschrittene

Multi-Platform-Beispiel

# Initiale Stage, lokale Plattform verwenden
FROM --platform=$BUILDPLATFORM golang:1.21 AS build

# Quellcode an Ort und Stelle kopieren WORKDIR /src COPY . .
# Umgebungsvariablen vom Host übernehmen ARG TARGETOS TARGETARCH
# Code mit den ARG-Variablen kompilieren RUN env GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /final/app .
# Container erstellen und den cross-kompilierten Code laden FROM alpine COPY --from=build /final/app /bin
Docker für Fortgeschrittene

Einen Multi-Platform-Build erstellen

  • Für einen Multi-Platform-Build verwenden wir statt docker build den Befehl docker buildx mit Optionen
  • docker buildx bietet mehr Befehle und Funktionen als docker build, u. a. die Angabe einer Plattform

docker buildx build --platform linux/amd64,linux/arm64 -t multi-platform-app .

  • Vor dem Build muss ein neuer Builder-Container vorhanden sein. Das erledigt docker buildx create --bootstrap --use.
Docker für Fortgeschrittene

Lass uns üben!

Docker für Fortgeschrittene

Preparing Video For Download...