#Что означает ошибка и при каких условиях возникает
Если образ рассчитан на процессоры amd64, а Docker работает на arm64, проверьте поддерживаемые архитектуры, наличие эмуляции и возможность сборки нативного arm64-образа. Это узкий случай, когда образ существует, но его запуск на arm64 завершается exec format error или ошибками в двоичных зависимостях. В отличие от no matching manifest, требуется проверить не только наличие манифеста, но и реальную совместимость бинарных файлов.
#Как различить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| В реестре доступен только linux/amd64Многоплатформенный индекс или одиночный манифест не содержит сборки arm64. | docker buildx imagetools inspect перечисляет linux/amd64, но не linux/arm64. | Выбрать официальный многоархитектурный образ или собрать нативную версию. |
| Эмуляция x86-64 недоступна или недостаточнаЗапуск amd64 на arm64 может требовать эмуляции и иногда работает медленно или нестабильно. | Система предупреждает о платформе, контейнер не стартует либо падает на бинарном файле. | Использовать совместимую нативную архитектуру, эмуляцию только для ограниченного теста. |
| Внутри образа смешаны разные архитектурыОбраз объявлен как arm64, но скопированная исполняемая программа собрана для amd64. | Операционная система контейнера arm64, а отдельная программа завершается exec format error. | Пересобрать этот бинарный файл для arm64, проверить сборочные стадии и зависимости. |
Запрошена не та платформа в конфигурацииВ compose.yaml или Dockerfile жёстко закреплено platform: linux/amd64, хотя образ доступен и для arm64. | Контейнер выбирает amd64 несмотря на ARM-хост. | Удалить ненужное закрепление после теста реальной совместимости. |
#Пошаговая диагностика и исправление
- Проверьте платформу движка и симптом без измененийОткройте терминал (Windows — PowerShell, macOS/Linux — «Терминал») и выполните
docker version --format "{{.Server.Os}}/{{.Server.Arch}}". В ответе ожидается, например, linux/arm64 для ARM-движка. Затем запуститеdocker compose logs --tail=80 appдля нужного сервиса. Если появляетсяexec format error, запишите точное имя запускаемого бинарного файла; ошибка бывает и из-за неверного формата скрипта, поэтому одной архитектуры недостаточно для вывода. - Узнайте архитектуру опубликованного образаДля образа в реестре выполните
docker buildx imagetools inspect nginx:alpineкак безопасный пример и затем ту же команду для вашего фактического образа (подставьте его адрес и тег). В секции Manifest/Platform ищите linux/arm64. Если команда пишет, что buildx не установлен, проверьте версию Docker и доступность компонента сборки. Для приватного реестра потребуется штатная авторизация, не передавайте логины в командной строке. - Сравните платформу уже скачанного образаДля локального образа выполните
docker image inspect --format "{{.Os}}/{{.Architecture}}" ИМЯ_ОБРАЗА, заменив ИМЯ_ОБРАЗА фактическим тегом. Эта команда ничего не запускает. Если вывод linux/amd64, а движок linux/arm64, двоичные файлы могут требовать эмуляции; если вывод arm64, но ошибка остаётся, проверьте отдельно исполняемый файл внутри образа и скрипт запуска. - Проверьте, не закреплена ли платформа в ComposeВ редакторе откройте compose.yaml; найдите у службы параметр
platform:. Если прописано linux/amd64, выясните, почему он добавлен. Удалять его можно лишь после проверки наличия нативного arm64-варианта и совместимости приложения. Выполнитеdocker compose config -q. В Dockerfile также проверьте платформу у каждой стадии сборки; слепое изменение FROM не исправит сторонний x86-бинарник. - Предпочтите образ с нативной поддержкой arm64Если издатель публикует linux/arm64 для того же продукта, выберите нужную версию и проверьте её через imagetools inspect. В отдельном тестовом проекте выполните
docker pull --platform linux/arm64 nginx:alpine, затемdocker image inspectдля проверки архитектуры. Для собственного приложения пересоберите его под arm64; бинарные зависимости должны поддерживать целевую платформу. Не используйте неподтверждённые сторонние сборки ради скорости. - Когда доступна только amd64-сборка, оцените эмуляциюНа поддерживаемых платформах Docker Desktop может запускать x86_64 под ARM с эмуляцией, а на Linux Engine может понадобиться отдельно настроенный binfmt/QEMU. Это зависит от хоста и прав администратора. Для учебного ограниченного теста после выяснения поддержки допустимо
docker run --rm --platform linux/amd64 alpine:3.20 uname -m: ожидаемая строка обычно x86_64. Если получаете exec format error, не модифицируйте binfmt на корпоративном сервере без администратора; предпочтите нативную сборку. - Для собственного проекта собирайте целевую платформу явноВ тестовом каталоге с Dockerfile используйте
docker build --platform linux/arm64 -t local-arm-demo:dev .на совместимом сборщике. Такая сборка не гарантирует успешной работы, если установочный скрипт скачивает готовый amd64-бинарник. При многоархитектурной сборке через buildx проверяйте, где создаётся образ и требуется ли реестр:--platform linux/amd64,linux/arm64не означает, что оба результата обязательно появятся в обычном локальном хранилище. - Запустите проверку только в тестовом окруженииДля нативного тестового образа выполните
docker run --rm --platform linux/arm64 alpine:3.20 uname -mна ARM-хосте. Ожидается aarch64, после чего запустите своё приложение и проверьте его функции и зависимости. Не принуждайте рабочую базу данных работать под эмуляцией без подтверждённой совместимости и резервной копии. Если ошибок нет в учебном Alpine, но есть в приложении, ищите собственный бинарник или библиотеку неправильной архитектуры. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Минимальный пример для отдельного тестового проекта
docker build --platform linux/arm64 -t local-arm-demo:dev .. Если ваш продукт компилируется, его реальные шаги должны поддерживать arm64.FROM alpine:3.20
CMD ["uname", "-m"]#Как проверить результат и что делать, если проблема осталась
Успех — образ/исполняемый файл действительно arm64 (для Linux обычно aarch64), контейнер запускается и проходят проверки приложения. Если образ уже arm64, но exec format error остаётся, исследуйте скопированные бинарные программы или неверные окончания строк/интерпретатор скрипта; ошибку не исправить одной опцией platform.