#Что означает ошибка
/bin/sh: ./app: not found
/bin/sh: ./app: not found при существующем исполняемом файле в Alpine — классический признак бинарника, собранного под glibc. Alpine использует musl libc, поэтому ELF-файл ищет загрузчик /lib64/ld-linux-x86-64.so.2, которого нет. Само сообщение относится к загрузчику, а не к файлу.
Решения: собрать под musl, использовать совместимый слой glibc или выбрать базовый образ на glibc.
Диагностика занимает секунды.
Alpine использует библиотеку musl, а скомпилированные программы часто собраны для glibc и не находят загрузчик. Используйте пакет gcompat, соберите программу в Alpine или возьмите образ Debian.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Программа собрана с glibc | Нет ld-linux. | Установите gcompat. |
| Неверная архитектура | arm/amd64. | Проверьте file. |
| Нет зависимостей | Библиотеки. | ldd. |
| Нужен glibc | Тяжёлые зависимости. | Образ Debian. |
#Пошаговое решение
- Проверьте file и lddДля Alpine Linux определите тип файла:
file ./имя_программы, затемldd ./имя_программы. Если бинарный файл собран для glibc, он может не работать под musl даже если файл существует. Сначала ищите сборку для Alpine/musl;apk add gcompatподходит не для всех программ. Не заменяйте системный libc и не скачивайте случайные библиотеки с форумов. - Для скриптов установите bashЕсли скрипт начинается с
#!/bin/bash, проверьте наличие оболочки черезcommand -v bash. Если команда ничего не вывела, в консоли Alpine с правами root выполнитеapk add bash, затем запустите скрипт снова, предварительно просмотрев его содержимое и источник. Для скриптов, использующих только POSIX-синтаксис, иногда достаточно заменить первую строку на#!/bin/sh, но только после проверки совместимости; ошибка нативного бинарного файла из-за musl этим не исправляется. - Попробуйте apk add gcompatЕсли
ls -l ./имя_программыподтверждает существование исполняемого файла, а оболочка отвечаетnot found, проверьте не только имя файла, но и интерпретатор:file ./имя_программыиreadelf -l ./имя_программы | grep interpreter(при отсутствии readelf понадобится пакет binutils). Если указан загрузчик glibc/lib64/ld-linux-x86-64.so.2, попробуйте для совместимой программы установитьgcompatкомандойapk add gcompatот root. Эта библиотека не обеспечивает полную совместимость: повторите запуск и, если ошибка сохранилась, сохраните точный вывод. Не создавайте вручную произвольные ссылки в/lib. - Соберите под muslЕсли исходный код программы доступен, предпочтите официальную сборку для Alpine/musl. Откройте страницу проекта и найдите сборку с пометкой
muslдля вашей архитектуры; тип архитектуры покажетuname -m. При собственной компиляции установите перечисленные проектом пакеты для сборки и выполните его официальную процедуру, не подменяя её универсальной командой. После сборки проверьтеfileиlddдля нового файла; если программа использует закрытые библиотеки glibc, пересборка может оказаться невозможной — тогда используйте рекомендованный автором контейнер/дистрибутив. - Выберите образ на glibcЕсли программа поставляется только в сборке под glibc, а
gcompatне решает проблему, используйте официальный образ на базе Debian или Ubuntu либо запросите сборку под musl у разработчика. Для контейнера замените базовый образ в Dockerfile, установите зависимости штатным пакетным менеджером нового образа и проверьте приложение в тестовом окружении. Не копируйте системные библиотеки glibc вручную в Alpine: это может создать нестабильную комбинацию библиотек. - Показывает тип исполняемого файла только если ./app — действительный проверенный путьLinux · Терминал (Bash)КомандаПоказывает тип исполняемого файла только если ./app — действительный проверенный путь. gcompat не гарантирует совместимость всех программ glibc; установка требует отдельного решения.
file ./app
#Диагностика
Проверьте формат: file ./app и ldd ./app (not found у ld-linux). readelf -l ./app | grep interpreter покажет путь интерпретатора. Если он /lib64/ld-linux-x86-64.so.2 — glibc. Установите file: apk add file. Убедитесь, что архитектура совпадает (uname -m: x86_64, aarch64).
#Варианты решения
1) Соберите приложение под Alpine (musl): в Docker — многоступенчатая сборка на golang:alpine, rust:alpine, для Go отключите CGO (CGO_ENABLED=0). 2) Установите слой совместимости: apk add gcompat (простые случаи) или установите glibc-пакет из sgerrand/alpine-pkg-glibc (используйте осознанно). 3) Используйте образ на glibc: debian:stable-slim, ubuntu или -slim варианты. 4) Для Python/Node с бинарными колёсами (manylinux) используйте apk add py3-пакет либо glibc-образ, так как колёса manylinux не работают на musl (для них есть musllinux).
#Отличия musl
Различия: DNS-резолвер, локали, поведение iconv, отсутствует часть расширений glibc. Для проприетарного ПО (Oracle JDK, некоторые драйверы) официальных сборок под musl может не быть — берите OpenJDK из apk add openjdk17. Если нужен только запуск скриптов, проверьте shebang: #!/bin/bash — установите bash (apk add bash), так как в Alpine по умолчанию только ash; это даёт ту же ошибку not found.
cat /etc/alpine-releasecommand -v filecommand -v readelf