程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 .NET Core Docker 映像中包含共享 C 库 (.SO)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 .NET Core Docker 映像中包含共享 C 库 (.SO)?

开发过程中遇到在 .NET Core Docker 映像中包含共享 C 库 (.SO)的问题如何解决?下面主要结合日常开发的经验,给出你关于在 .NET Core Docker 映像中包含共享 C 库 (.SO)的解决方法建议,希望对你解决在 .NET Core Docker 映像中包含共享 C 库 (.SO)有所启发或帮助;

我正在尝试在我的 .net Core 5.0 项目中使用 C# 库,它是 C Assembly for ws281x LED 的 C# 包装器。该库要求在运行框架之前构建 Shared C library (ws2811.so)。我已经成功地为我的树莓派构建了 C 共享库并将其安装到 /usr/lib 中,并对其进行了测试以确认它有效。

问题在于在我的 Dockerfile 中,我不知道如何/在何处正确安装此共享 C 库。我目前的dockerfile如下:

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
workdir /source
copY ./ /source

# installs NodeJs and NPM
RUN apt-get update -yq && apt-get upgrade -yq && apt-get install -yq curl git nano
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && apt-get install -yq nodeJs build-essential

RUN npm install -g npm
RUN npm --version

# installing c wrapper for ws2811 -- Here is where I need HelP
RUN apt-get update && apt-get install -y python
RUN apt-get install -y python-setuptools python-dev build-essential python-pip

RUN pip install scons && git clone https://github.com/jgarff/rpi_ws281x.git \
         && cd rpi_ws281x && scons && gcc -shared -o ws2811.so *.o

# copy csproj and restore as disTinct layers
copY *.sln .
copY control/ *.csproj ./control/
RUN dotnet restore -r linux-arm

# copy everything else and build app
copY control/. ./control/
workdir /source/control
RUN dotnet publish -c release -o /app -r linux-arm --self-contained false --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim-arm32v7
workdir /app
copY --from=build /app ./
ENTRYPOINT ["./control"]

现在,dockerfile 正确构建并且应用程序启动。但是,当我尝试使用某种方法通过P/Invoke 调用ws2811.so 库时,出现以下错误:

System.DllNotFoundException: 无法加载共享库“ws2811.so”或其依赖项之一。为了帮助诊断加载问题,请虑设置 LD_DEBUG 环境变量:libws2811.so: cAnnot open shared object file: No such file or directory

这告诉我 P/Invoke 没有成功找到 ws2811.so 库。我应该把这个 ws2811.so 库放在哪里,以便我的 C# 代码可以访问它?我试过把它和源代码放在一起,我试过在 docker 中安装它,但我真的处于停滞状态,不知道从哪里开始。

有关更多信息,调用此 C 共享库的 C# 代码如下。它本质上与 ws281x GitHub 上的示例中所做的相同(如前所述)。

public voID setRgb()
        {
            Console.Writeline("R: " + r + "\tG: " + g + "\tB: " + b);

            var setTings = SetTings.CreateDefaultSetTings(false);
            var controller = setTings.AddController(88,Pin.Gpio18,StripType.WS2812_StriP,255,falsE);

            color color = new color();
            color = color.FromArgb(r,g,b);

            using (var rpi = new WS281x(setTings)) // EXCEPTION OCcurs HERE (System.DllNotFound)
            {
                rpi.SetLedCount(88);
                rpi.SetAll(color);
            }
        }

非常感谢任何帮助、指导或资源!非常感谢:)

解决方法

Docker 有一个“构建上下文”的概念。这定义了从中访问文件的目录。因此,当您在 Dockerfile 中说 COPY foo /foo 时,就是从构建上下文复制 foo 文件并将其放置在名为 foo 的容器的根文件夹中。您在运行 docker build 命令时设置构建上下文。很多时候,人们使用 . 作为构建上下文,这意味着您从中运行命令的当前工作目录(例如 docker build -t app .)。所以这取决于你的构建上下文是什么目录。您应该在此处放置 .SO 库,以便您可以在 Dockerfile 中添加 COPY 指令以将其复制到容器映像中。

大佬总结

以上是大佬教程为你收集整理的在 .NET Core Docker 映像中包含共享 C 库 (.SO)全部内容,希望文章能够帮你解决在 .NET Core Docker 映像中包含共享 C 库 (.SO)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。