docker buildx build în Docker

Build și Multi-Arhitectură Docker Buildx v0.10+

Construirea de imagini container optimizate multi-arhitectură pentru rulare transparentă atât pe procesoare Intel/AMD, cât și pe ARM (Apple Silicon / AWS Graviton).

Sintaxă comandă
docker buildx build --platform linux/amd64,linux/arm64 ...

Popularizarea masivă a procesoarelor ARM (laptopurile Mac M1/M2/M3/M4 și instanțele AWS Graviton) a creat o mare problemă de compatibilitate: o imagine Docker construită pe un Mac ARM64 va eșua pe un server de producție cu procesor Intel AMD64 cu eroarea `exec format error`.

Extensia oficială Docker Buildx (bazată pe motorul modern Moby BuildKit) permite construirea de imagini multi-platformă printr-o singură comandă. Prin emulare QEMU sau noduri native distribuite, Buildx generează un manifest comun ce conține binarele compilate pentru ambele arhitecturi.

Când un server descarcă imaginea prin `docker pull`, motorul Docker descarcă automat exclusiv feliile de imagine potrivite pentru arhitectura hardware a mașinii gazdă.

Sintaxă, opțiuni și concepte cheie

Opțiune / Concept Descriere practică
--platform linux/amd64,linux/arm64 Lista arhitecturilor hardware țintă compilate în paralel.
--push Încarcă automat imaginea și manifestul multi-arhitectură direct în registrul de imagini (Docker Hub / AWS ECR).
--cache-to / --cache-from Exportarea și reutilizarea straturilor de memorie cache pe GitHub Actions pentru accelerarea CI/CD.
docker buildx create --use Creează și activează o instanță nouă izolată de BuildKit builder.

Exemple practice și cod

Exemplul 1: Crearea unui builder și compilarea imaginii pentru x86_64 și ARM64

Comenzile complete pentru crearea unei imagini universale.

# 1. Creăm o instanță modernă de buildx cu suport de container:
$ docker buildx create --name builder-universal --use
$ docker buildx inspect --bootstrap

# 2. Construim și publicăm imaginea pentru ambele arhitecturi simultan:
$ docker buildx build \
    --platform linux/amd64,linux/arm64 \
    -t organizatie/api-backend:v1.0 \
    --push .

# Rezultat pe Docker Hub: imaginea are etichete native atât pentru 'linux/amd64' cât și pentru 'linux/arm64'!

Rezultat & Impact

Imaginea rulează identic și fără erori de arhitectură pe Mac, servere locale și instanțe cloud.

Greșeli frecvente și bune practici

  • Uitarea flagului `–push` atunci când construiești imagini multi-platformă; daemonul Docker local nu poate stoca simultan două arhitecturi diferite sub același tag local fără a le trimite la un registry.
  • Compilarea de pachete C++ fără pachetele native de cross-compilare, ceea ce face ca emularea QEMU să fie foarte lentă.

Ghiduri și noțiuni înrudite