Ошибка загрузки родной библиотеки «/app/runtimes/linux/native/libgrpc_csharp_ext.x64.so — Grpc Core в контейнере Docker

#docker #.net-core #&rpc

#docker #.net-core #&rpc

Вопрос:

Я создаю приложение web API, используя .СЕТЕВОЕ ядро и &RPC для Csharp.

На локальном это работает очень хорошо, но когда я создаю контейнер и запускаю его на Docker Desktop, при вызове метода появляется ошибка:

 System.IO.IOException: Error loadin& native library "/app/runtimes/linux/native/lib&rpc_csharp_ext.x64.so". Error loadin& shared library ld-linux-x86-64.so.2: No such file or directory (needed by /app/runtimes/linux/native/lib&rpc_csharp_ext.x64.so)
   at Grpc.Core.Internal.Unmana&edLibrary..ctor(Strin&[] libraryPathAlternatives)
   at Grpc.Core.Internal.NativeExtension.LoadUnmana&edLibrary()
   at Grpc.Core.Internal.NativeExtension.LoadNativeMethods()
   at Grpc.Core.Internal.NativeExtension..ctor()
   at Grpc.Core.Internal.NativeExtension.Get()
   at Grpc.Core.Internal.NativeMethods.Get()
   at Grpc.Core.GrpcEnvironment.GrpcNativeInit()
   at Grpc.Core.GrpcEnvironment..ctor()
   at Grpc.Core.GrpcEnvironment.AddRef()
   at Grpc.Core.Channel..ctor(Strin& tar&et, ChannelCredentials credentials, IEnumerable`1 options)
   at Net.Core.Grpc.IPEndpointStrate&y.SetCallInvokers(Strin& serviceName, Boolean filterBlack)
   at Net.Core.Grpc.IPEndpointStrate&y.Get(Strin& serviceName)
   at Net.Core.Grpc.ClientCallInvoker.Call[TResponse](Func`2 call, Int32 retryLeft)
   at Net.Core.Grpc.ClientCallInvoker.AsyncUnaryCall[TRequest,TResponse](Method`2 method, Strin& host, CallOptions options, TRequest request)
   at Grpc.Core.Interceptors.Interceptin&CallInvoker.<AsyncUnaryCall&&t;b__4_0[TRequest,TResponse](TRequest req, ClientInterceptorContext`2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfi&uration.ClientBaseConfi&urationInterceptor.AsyncUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext`2 context, AsyncUnaryCallContinuation`2 continuation)
   at Grpc.Core.Interceptors.Interceptin&CallInvoker.AsyncUnaryCall[TRequest,TResponse](Method`2 method, Strin& host, CallOptions options, TRequest request)
   at INRES.Service.Cate&ory.GetAllDvhcService.GetAllDvhcServiceClient.GetAllDvhcAsync(GetAllDvhcRequest request, CallOptions options)
   at INRES.Service.Cate&ory.GetAllDvhcService.GetAllDvhcServiceClient.GetAllDvhcAsync(GetAllDvhcRequest request, Metadata headers, Nullable`1 deadline, CancellationToken cancellationToken)
   at iNRES.Service.Meteorolo&y.Domain.QueryHandlers.TramkttvQueryHandler.Handle(GetTramkttvQuery request, CancellationToken cancellationToken) in /app/src/iNRES.Service.Meteorolo&y/Domain/QueryHandlers/TramkttvQueryHandler.cs:line 66
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDele&ate`1 next)
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDele&ate`1 next)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDele&ate`1 next)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDele&ate`1 next)
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDele&ate`1 next)
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDele&ate`1 next)
   at iNRES.Service.Meteorolo&y.Controllers.BaseController.QueryAsync[TResult](IRequest`1 query) in /app/src/iNRES.Service.Meteorolo&y/Controllers/BaseController.cs:line 45
   at iNRES.Service.Meteorolo&y.Controllers.MtTramkttvController.GetById(Int32 id) in /app/src/iNRES.Service.Meteorolo&y/Controllers/MtTramkttvController.cs:line 39
   at 
  

Это мой файл Docker:

 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
WORKDIR /app
ARG sln=myproject.sln
ARG service=src/myproject
ARG confi&uration=Release
COPY ${sln} ./
COPY ./${service} ./${service}/
COPY ./${tests} ./${tests}/
RUN apk update amp;amp; apk add libc6-compat
RUN dotnet restore /property:Confi&uration=${confi&uration}
COPY . ./
RUN dotnet publish ${service} -c ${confi&uration} -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine as runtime
RUN echo 'http://dl-cdn.alpinelinux.or&/alpine/v3.8/main' &&t;&&t; /etc/apk/repositories amp;amp; apk update --no-cache amp;amp; apk add --no-cache bash libc6-compat=1.1.19-r11
WORKDIR /app
COPY --from=build /app/${service}/${confi&uration}/out .
ENV ASPNETCORE_URLS http://*:5000
ENV ASPNETCORE_ENVIRONMENT docker
EXPOSE 5000
ENTRYPOINT dotnet myproject.dll
  

Комментарии:

1. То же самое здесь, без Docker, пытающегося запустить dotnet 3.1 на Raspberry Pi. dotnet publish -r linux-arm -o binlinux-armpublish . Нашел ваш пост во время поиска проблемы.

2. вы нашли какое-либо решение? похоже, что библиотека опубликована в корневой папке вывода, но она пытается загрузить ее из папки среды выполнения

3. @horseman1210 Вы нашли решение, работающее на Raspberry Pi?

Ответ №1:

Для тех, кто сталкивался с этой ошибкой на Raspberry Pi, проблема в том, что собственная библиотека lib&rpc_csharp_ext в настоящее время не скомпилирована и не создана для процессора arm7. Я заставил это работать, самостоятельно скомпилировав &RPC для arm7 с помощью этого метода. Теперь все работает так, как ожидалось.

Вы также можете найти блог об этой проблеме здесь: https://dev.to/erikest/&rpc-on-dotnet-core-preview3-on-raspberrypi-3-4nf4

Ответ №2:

Для меня сработало использовать другой образ среды выполнения, добавлять не нужно libc6-compat

 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime