Docker multi-architecture
ARM est partout : Raspberry Pi, AWS Graviton, Oracle Ampere, Apple Silicon. Construire des images multi-arch permet de distribuer un seul tag qui fonctionne sur toutes les architectures. Le manifest OCI multi-platform gère la sélection automatique.
buildx et QEMU
# Vérifier les builders disponibles
docker buildx ls
# Créer un builder multi-plateforme
docker buildx create --name multiarch --driver docker-container --bootstrap --use
# Activer l'émulation QEMU (pour cross-compilation)
docker run --privileged --rm tonistiigi/binfmt --install all
# Vérifier les plateformes supportées
docker buildx inspect --bootstrapBuild et push multi-arch
# Build pour plusieurs architectures et push
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --tag ghcr.io/org/myapp:1.0.0 --tag ghcr.io/org/myapp:latest --push .
# Inspecter le manifest multi-arch
docker buildx imagetools inspect ghcr.io/org/myapp:latestDockerfile multi-arch
# BuildKit expose TARGETPLATFORM, TARGETOS, TARGETARCH automatiquement
FROM --platform=$BUILDPLATFORM golang:1.23-alpine AS builder
ARG TARGETARCH
ARG TARGETOS
WORKDIR /src
COPY . .
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /app/server ./cmd/server
FROM gcr.io/distroless/static-debian12
COPY --from=builder /app/server /server
ENTRYPOINT ["/server"]Avec cette approche, la compilation Go native se fait sur l'architecture du builder (amd64) et cross-compile vers la cible. Bien plus rapide que l'émulation QEMU pour les compilations longues.
Builds natifs via nodeselector
# Avec des nœuds ARM disponibles (ex: Mac M1 ou Pi dans un cluster)
docker buildx create --name hybrid --platform linux/amd64 node-amd64:2376
docker buildx create --name hybrid --append --platform linux/arm64 node-arm64:2376
docker buildx use hybrid
# Build natif sur chaque architecture, pas d'émulation
docker buildx build --platform linux/amd64,linux/arm64 --push -t myapp:latest .GitHub Actions multi-arch
- name: Build and push multi-arch
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
push: true
tags: ghcr.io/${{ github.repository }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max