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ă.