Docker: exec format error — образ собран для другого процессора
Образ собран для процессора другой архитектуры: например, на Mac с чипом Apple — для arm64, а сервер — x86_64. Узнайте архитектуру сервера и образа и соберите образ под сервер.
Содержание 9
Как выглядит ошибка
Контейнер сразу останавливается, а в его логах (docker logs web) одна строка:
exec /usr/local/bin/docker-entrypoint.sh: exec format errorВместо пути у вас будет программа, которую контейнер запускает первой. Перед запуском Docker может ещё и предупредить:
WARNING: The requested image's platform (…) does not match the detected host platform (…) and no specific platform was requestedВ первых скобках — платформа образа, во вторых — платформа сервера. При скачивании готового образа бывает и третье сообщение:
no matching manifest for linux/arm64/v8 in the manifest list entriesОно значит, что у образа нет версии для платформы, указанной в начале.
Почему так
Программы собирают под определённый тип процессора. Серверы бывают x86_64 — в Docker это называется amd64 — и ARM, в Docker arm64. Компьютеры Mac с чипом Apple — тоже ARM. Образ, собранный на таком Mac без особых настроек, получится для arm64 и на сервере x86_64 не запустится. И наоборот: образ amd64 не запустится на ARM-сервере.
Шаг 1. Узнайте архитектуру сервера
Команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.
uname -mx86_64 — сервер amd64, aarch64 — сервер arm64.
Шаг 2. Узнайте архитектуру образа
docker image inspect -f '{{.Os}}/{{.Architecture}}' myappВместо myapp подставьте имя образа из колонки IMAGE команды docker ps -a. Ответ linux/arm64 при сервере x86_64 — это и есть причина ошибки.
Шаг 3. Соберите образ под сервер
Проще всего собрать образ прямо на сервере — тогда он сам получится под его архитектуру. Скопируйте папку проекта с файлом Dockerfile на сервер, перейдите в неё и выполните:
docker build -t myapp .Точка в конце — это «текущая папка», её не пропускайте. Если собираете образ на своём компьютере, укажите платформу сервера явно:
docker build --platform linux/amd64 -t myapp .Для ARM-сервера — --platform linux/arm64. Затем удалите старый контейнер (docker rm web) и запустите новый из пересобранного образа.
Если образ чужой
Для готового образа найдите на его странице в реестре тег для своей архитектуры или другой образ, который её поддерживает. Сообщение no matching manifest как раз значит, что для вашей платформы версии нет.
Если архитектура совпадает
Та же ошибка бывает, когда контейнер запускает скрипт без первой строки с указанием программы, которая его выполняет. Откройте скрипт из сообщения и проверьте первую строку. Должно быть, например:
#!/bin/shБез такой строки система не знает, чем запускать файл, и отвечает exec format error. Добавьте её первой строкой, пересоберите образ и запустите контейнер снова.
Тексты ошибок сверены с исходным кодом Docker 29.1.3 — эта версия ставится из пакетов Ubuntu 24.04. В Docker 28 и более старых версиях часть сообщений звучит иначе.
Источники
- Исходный код runc 1.3.4: linux.go — откуда берётся строка exec …: exec format error.
- Справочник Linux: execve — ENOEXEC: файл в неизвестном формате или для другой архитектуры.
- Исходный код Docker 29.1.3: create.go — предупреждение о несовпадении платформы.
- Исходный код Docker 29.1.3: image_pull.go — текст no matching manifest.
- Документация Docker: сборка под несколько платформ — образ для одной архитектуры не запустится на другой.
- Документация Docker: docker buildx build — флаг --platform.
Сверено 10 октября 2026 года.
Что почитать дальше
Проверено и обновлено: 10.10.2026