gpt4 book ai didi

.net-core - 无法在基于 alpine 的 dotnet SDK 中运行 gRPC 协议(protocol)

转载 作者:行者123 更新时间:2023-12-04 08:32:21 26 4
gpt4 key购买 nike

请参阅此 github 问题:https://github.com/grpc/grpc/issues/18338

请参阅此示例存储库:https://github.com/slolife/alpine-protoc

如果我包含 Grpc.Tools 1.19.0 项目中的 nuget 包,其中添加了构建步骤 <Protobuf Include="Test.proto" />
如果我创建一个 docker 镜像来构建和使用 microsoft/dotnet:2.2-sdk,这可以正常工作作为构建图像。但是,如果我尝试使用基于 alpine 的 microsoft/dotnet:2.2-sdk-alpine构建镜像,构建失败并显示以下错误消息:
/root/.nuget/packages/grpc.tools/1.19.0/build/_protobuf/Google.Protobuf.Tools.targets(263,5): error MSB6003: The specified task executable "/root/.nuget/packages/grpc.tools/1.19.0/tools/linux_x64/protoc" could not be run. No such file or directory [/src/alpine-protoc.csproj]
我确认 protoc文件位于错误消息所提示的位置。

我尝试运行 apk add libc6-compat并重新运行构建。这次我收到以下错误:
/root/.nuget/packages/grpc.tools/1.19.0/build/_protobuf/Google.Protobuf.Tools.targets(263,5): error MSB6006
: "/root/.nuget/packages/grpc.tools/1.19.0/tools/linux_x64/protoc" exited with code 139. [/src/alpine-proto
c.csproj]

更新:
来自 ldd protoc 的输出

~/.nuget/packages/grpc.tools/1.19.0/tools/linux_x64 # ldd protoc
/lib64/ld-linux-x86-64.so.2 (0x7f60935a7000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f60935a7000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f60935a7000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f60935a7000)

最佳答案

这似乎是一个 libc 兼容性问题 - 我最好的猜测是 dotnet 拉大陆,glibc 兼容 protoc连同grpc。
No such file or directory运行存在且可访问的可执行文件时,Alpine 上的错误是 ld 的典型错误无法解析依赖库,例如 libc.so.6 .

来自 ldd protoc输出我们可以看到 protoc 需要 libc.so.6 ,所以它很可能是使用 glibc 在 Linux 上构建的,例如 Ubuntu 或 Debian。 libc6-compat软件包在 musl libc 之上提供了一个兼容层,以允许基本的 glibc 功能,例如,添加所需的库文件和缺少的函数。但是,它不提供完整的 glibc 兼容性。依赖于 glibc 的复杂应用程序在与 musl libc 链接时不太可能开箱即用,至少在没有一些移植工作的情况下不会。

当您添加 libc6-compat , protoc能够链接到 musl-glibc 兼容性库,libc.so.6等,但是当运行退出代码 139 ,这意味着它发生了段错误(得到了 SIGSEGV)。这很好地表明您必须将它与实际的 glibc 一起使用。造成这种情况的一个可能原因是默认堆栈大小:musl libc 创建的线程具有非常小的默认堆栈大小,大约 68kb,而 glibc 线程是使用 2-8MB 堆栈创建的。有关其他细微差别,请参阅:https://wiki.musl-libc.org/functional-differences-from-glibc.html .

您可以尝试使用简单的 hack 解决 nuget 包不兼容问题:安装 Alpine compatible protobuf编译器,带有 apk add protobuf ;然后,更换您的 protoc带有指向 /usr/bin/protoc 的符号链接(symbolic link).

或者,您可以尝试在 Alpine 上安装正确的 glibc,方法是将以下内容添加到您的 Dockerfile(感谢 sgerrandanapsix):

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

关于.net-core - 无法在基于 alpine 的 dotnet SDK 中运行 gRPC 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com