Alpine Linux Alpine Linux

Alpine: «not found» при запуске бинарного файла (musl и glibc)

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Alpine использует библиотеку musl, а скомпилированные программы часто собраны для glibc и не находят загрузчик. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Диагностика
  5. Варианты решения
  6. Отличия musl

#Что означает ошибка

Сообщение
/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.

#Пошаговое решение

  1. Проверьте file и lddДля Alpine Linux определите тип файла: file ./имя_программы, затем ldd ./имя_программы. Если бинарный файл собран для glibc, он может не работать под musl даже если файл существует. Сначала ищите сборку для Alpine/musl; apk add gcompat подходит не для всех программ. Не заменяйте системный libc и не скачивайте случайные библиотеки с форумов.
  2. Для скриптов установите bashЕсли скрипт начинается с #!/bin/bash, проверьте наличие оболочки через command -v bash. Если команда ничего не вывела, в консоли Alpine с правами root выполните apk add bash, затем запустите скрипт снова, предварительно просмотрев его содержимое и источник. Для скриптов, использующих только POSIX-синтаксис, иногда достаточно заменить первую строку на #!/bin/sh, но только после проверки совместимости; ошибка нативного бинарного файла из-за musl этим не исправляется.
  3. Попробуйте 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.
  4. Соберите под muslЕсли исходный код программы доступен, предпочтите официальную сборку для Alpine/musl. Откройте страницу проекта и найдите сборку с пометкой musl для вашей архитектуры; тип архитектуры покажет uname -m. При собственной компиляции установите перечисленные проектом пакеты для сборки и выполните его официальную процедуру, не подменяя её универсальной командой. После сборки проверьте file и ldd для нового файла; если программа использует закрытые библиотеки glibc, пересборка может оказаться невозможной — тогда используйте рекомендованный автором контейнер/дистрибутив.
  5. Выберите образ на glibcЕсли программа поставляется только в сборке под glibc, а gcompat не решает проблему, используйте официальный образ на базе Debian или Ubuntu либо запросите сборку под musl у разработчика. Для контейнера замените базовый образ в Dockerfile, установите зависимости штатным пакетным менеджером нового образа и проверьте приложение в тестовом окружении. Не копируйте системные библиотеки glibc вручную в Alpine: это может создать нестабильную комбинацию библиотек.
  6. Показывает тип исполняемого файла только если ./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.

ТекстКоманда
Проверьте выпуск и наличие инструментов без принудительной установки bash, file и gcompat; несовместимость бинарного файла диагностируется отдельно.
cat /etc/alpine-release
command -v file
command -v readelf

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.