Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 无法在基于alpine的dotnet SDK中运行gRPC协议_.net Core_Grpc_Alpine - Fatal编程技术网

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

.net core 无法在基于alpine的dotnet SDK中运行gRPC协议,.net-core,grpc,alpine,.net Core,Grpc,Alpine,请参阅此github问题: 请参见此回购示例: 如果我在项目中包括Grpc.Tools 1.19.0nuget包,它会添加一个构建步骤 如果我创建一个docker映像来构建并使用microsoft/dotnet:2.2-sdk作为构建映像,那么这很好。但是,如果我尝试使用基于alpine的microsoft/dotnet:2.2-sdk-alpinebuild映像,则生成失败,并显示以下错误消息: /root/.nuget/packages/grpc.tools/1.19.0/build/_pr

请参阅此github问题:

请参见此回购示例:

如果我在项目中包括Grpc.Tools 1.19.0nuget包,它会添加一个构建步骤

如果我创建一个docker映像来构建并使用
microsoft/dotnet:2.2-sdk
作为构建映像,那么这很好。但是,如果我尝试使用基于alpine的
microsoft/dotnet:2.2-sdk-alpine
build映像,则生成失败,并显示以下错误消息:

/root/.nuget/packages/grpc.tools/1.19.0/build/_protobuf/Google.protobuf.tools.targets(263,5):错误MSB6003:指定的任务可执行文件“/root/.nuget/packages/grpc.tools/1.19.0/tools/linux_x64/protoc”无法运行。没有这样的文件或目录[/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):错误MSB6006
:“/root/.nuget/packages/grpc.tools/1.19.0/tools/linux_x64/protoc”退出,代码139。[/src/alpine proto
c、 csproj]


更新: 来自
ldd协议的输出

~/.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与grpc一起拉动了大陆的glibc兼容
protoc

运行存在且可访问的可执行文件时,Alpine上的
无此类文件或目录
错误是
ld
无法解析相关库(如
libc.so.6
的典型错误

lddprotoc
输出中,我们可以看到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
等,但当run与code
139
一起退出时,意味着它出现了故障(得到了SIGSEGV)。这是一个很好的指示,表明您必须将它与实际的glibc一起使用。一个可能的原因是默认堆栈大小:musl libc创建的线程的默认堆栈大小非常小,约为68kb,而glibc线程创建的堆栈大小为2-8MB。有关其他细微差异,请参阅:

您可以尝试使用一个简单的技巧来解决nuget包的不兼容性问题:使用apk add protobuf安装编译器;然后,用指向
/usr/bin/protoc
的符号链接替换
protoc

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


可能是由于动态链接失败。你能粘贴
ldd
的输出吗?@valiano谢谢,用该输出更新了问题。我用符号链接路线测试了它,这就是问题所在。需要
protoc
libc6 compat
才能使整个过程正常工作。公布了回购协议的最终变更。希望Grpc.Tools包能够更新以支持开箱即用
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