Это похоже на проблему совместимости с libc - я думаю, что dotnet тянет за собой материк, glibc-совместимый protoc
вместе с grpc.
Ошибка No such file or directory
на Alpine.при запуске исполняемого файла, который присутствует и доступен, типично для ld
не удается разрешить зависимые библиотеки, такие как libc.so.6
.
Из вывода ldd protoc
мы можем видеть, что protoc требует libc.so.6
, поэтомувероятно был построен на Linux с glibc, такой как Ubuntu или Debian.Пакет libc6-compat
обеспечивает уровень совместимости поверх musl libc, чтобы обеспечить базовую функциональность glibc, например, добавление необходимых файлов библиотеки и отсутствующих функций.Однако он не обеспечивает полной совместимости с glibc.Сложные приложения, зависящие от glibc, вряд ли будут работать "из коробки", когда связаны с musl libc, по крайней мере, без каких-либо усилий по переносу.
Когда вы добавили libc6-compat
, protoc
смог соединиться сбиблиотеки совместимости musl-glibc, libc.so.6
и др., но при запуске завершается с кодом 139
, что означает, что он вышел из строя (получил SIGSEGV).Это хороший признак того, что вы должны использовать его с настоящим glibc.Одной из возможных причин этого является размер стека по умолчанию: musl libc создает потоки с очень маленьким размером стека по умолчанию, около 68 КБ, тогда как потоки glibc создаются со стеками 2-8 МБ.Для других тонких различий, обратитесь к: https://wiki.musl -libc.org / functions-отличию от-glibc.html .
Вы можете попробовать обойти несовместимость пакетов nuget, используя простойвзломать: установить Alpine-совместимый компилятор protobuf , с apk add protobuf
;затем замените ваш protoc
символической ссылкой на /usr/bin/protoc
.
В качестве альтернативы, вы можете попробовать установить правильный glibc на Alpine, добавив следующее в ваш Dockerfile (благодаря sgerrand и Анапсикс ):
ENV GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc
ENV GLIBC_VERSION=2.28-r0
RUN set -ex && \
apk --update add libstdc++ curl ca-certificates && \
for pkg in glibc-${GLIBC_VERSION} glibc-bin-${GLIBC_VERSION}; \
do curl -sSL ${GLIBC_REPO}/releases/download/${GLIBC_VERSION}/${pkg}.apk -o /tmp/${pkg}.apk; done && \
apk add --allow-untrusted /tmp/*.apk && \
rm -v /tmp/*.apk && \
/usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib