Docker buildx: собрать образ для amd64 и arm64

Категория: docker · Язык: Bash · Обновлено:

docker build по умолчанию собирает образ только для архитектуры текущей машины. Чтобы получить один тег с манифестом для linux/amd64 и linux/arm64, используют Buildx с несколькими значениями --platform и обязательным --push. Локальный Docker не может загрузить multi-arch образ через --load, поэтому результат отправляют в registry.

Собрать и отправить multi-arch образ

Bash
docker buildx create --name multiarch --use
docker buildx inspect --bootstrap

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --tag registry.example.com/app:1.2.3 \
  --push .

buildx create создаёт отдельный builder с драйвером docker-container; --bootstrap запускает его и показывает поддерживаемые платформы. Если в списке нет linux/arm64, установите эмуляцию QEMU командой docker run --privileged --rm tonistiigi/binfmt --install all или собирайте на нативном arm-раннере. Для CI удобнее готовые actions docker/setup-qemu-action и docker/setup-buildx-action.

Флаг --push обязателен для нескольких платформ: BuildKit не может положить manifest list в локальный image store обычного Docker. Если нужен только один образ для другой архитектуры, используйте --platform linux/arm64 --load — при одной платформе загрузка в локальный Docker работает. Проверить результат можно через docker buildx imagetools inspect registry.example.com/app:1.2.3.

Тег latest лучше не перезаписывать одновременно с версией: сначала публикуйте неизменяемый тег, затем при необходимости обновляйте latest. Для приватного registry выполните docker login заранее; в CI передавайте credentials через секреты, а не в команду. Кеш сборки можно ускорить через --cache-to/--cache-from, но не публикуйте слой с секретами.

Сборка под чужую архитектуру через QEMU заметно медленнее нативной. Для больших проектов используйте отдельные runners с arm64 или matrix-стратегию CI. Мульти-архитектурный образ увеличивает размер manifest и время публикации, поэтому проверяйте, что базовый образ действительно существует для каждой платформы.

Документация: docker buildx build, multi-platform images.