无法在基于Alpine的dotnet SDK中运行gRPC协议

慢生活

看到这个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用作生成映像,则此方法效果很好但是,如果我尝试使用基于高山的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拉了大陆,glibcprotoc与grpc兼容

No such file or directory运行存在的可访问可执行文件时,Alpine上错误通常是ld由于无法解析依赖库而引起的libc.so.6

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

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

您可以使用简单的技巧尝试解决nuget软件包不兼容的问题:使用;安装兼容Alpine的protobuf编译器apk add protobuf然后,将您protoc的链接替换/usr/bin/protoc

另外,您可以尝试在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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试构建运行协议缓冲区的基于Alpine的Docker容器时出现“ / bin / ash:协议:未找到”

gRPC 中的协议缓冲区无法保存大浮点数 - 该怎么办?

无法在 alpine 上运行 curl 7.83.0

如何在基于Alpine的Docker容器中配置umask

在基于Alpine Linux的Docker映像中安装pylint

在Docker中基于Alpine的映像上安装Redis

如何在基于Alpine的容器中安装rar?

dotnet核心:无法运行单元测试

Dotnet CLI命令无法运行DLL

在Alpine映像上运行dotnet core 2.1应用程序时出错

无法在 CentOS 中通过 sudo dotnet 访问 dotnet

无法连接到在本地Docker容器中运行的Go GRPC服务器

我无法将 flatc 安装到基于 yocto 的 SDK 中

协议功能无法快速运行3

无法为基于 alpine 的 docker 安装 Microsoft ODBC Driver 17

为什么我不能在 ubuntu 上运行基于 alpine 的 C 程序?

如何基于可在 ubuntu 上运行的 alpine 构建类似的 docker 映像?

在基于 Alpine Docker 的映像下运行 gitlab-ci.yml 脚本时出错

无法在 CI 服务器中运行 dotnet build。无法解析 nuget 包

在Swift中基于协议返回具体类型

无法在Docker Alpine中添加具有高UID的用户

我无法在 Alpine JS 中确定此消息的原因

错误:约束无法满足:Alpine Linux中的流(丢失)

我可以用gRPC替换基于套接字的协议吗?

Tensorflow预测grpc无法正常运行,但RESTful API正常运行

无法在3.1 docker容器中运行dotnet转储-“进程1未运行兼容的.NET Core运行时”

运行dotnet ef命令时无法识别的选项'-Context'

Docker-dotnet-无法从入口点运行应用

NSManagedObject无法符合Swift中的协议