Multi-platform builds

Docker voor gevorderden

Mike Metzger

Data Engineering Consultant

Multi-platform?

  • Wat betekent multi-platform?
    • Verschillende OS-typen
      • linux
      • windows
      • macos
    • Verschillende CPU-typen
      • x64_64 of amd64
      • arm64
      • arm7
  • Meestal genoteerd als os/cpu, bijv. linux/amd64

Linux Tux-logo

AMD64-logo

ARM-logo

Docker voor gevorderden

Multi-platform builds maken

  • Gebaseerd op multi-stage build-gedrag
  • De eerste/buildfase gebruikt vaak cross-compilers en hangt af van de hostarchitectuur
  • De eindfase gebruikt de architectuur/het OS van het target
Docker voor gevorderden

Multi-platform Dockerfile-opties

  • Buildfase gebruikt de vlag --platform=$BUILDPLATFORM
    • $BUILDPLATFORM is het platform van de host die de build draait
  • Soms met de ARG-directive
    • Geeft lokale omgevingsvariabelen door aan Docker build
    • Hier: TARGETOS en TARGETARCH
    • ARG TARGETOS TARGETARCH
    • Host-omgevingvariabelen kun je vooraf of via env definiëren.
Docker voor gevorderden

Multi-platformvoorbeeld

# Initial stage, using local platform
FROM --platform=$BUILDPLATFORM golang:1.21 AS build

# Copy source into place WORKDIR /src COPY . .
# Pull the environment variables from the host ARG TARGETOS TARGETARCH
# Compile code using the ARG variables RUN env GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /final/app .
# Create container and load the cross-compiled code FROM alpine COPY --from=build /final/app /bin
Docker voor gevorderden

Een multi-platform build maken

  • Voor een multi-platform build gebruik je docker buildx met opties, niet docker build
  • docker buildx biedt extra commando’s en functies t.o.v. docker build, zoals een platform opgeven

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

  • Voor de build moet er een nieuwe builder-container zijn. Maak die met docker buildx create --bootstrap --use.
Docker voor gevorderden

Laten we oefenen!

Docker voor gevorderden

Preparing Video For Download...