在中包含共享C库(.SO).NET核心Docker镜像



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

问题在于,在我的Dockerfile中,我不知道如何/在哪里正确安装这个共享的C库。我目前的档案如下:

# 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库时,我会得到以下错误:

系统。DllNotFoundException:无法加载共享库"ws2811.so"或其依赖项之一。为了帮助诊断加载问题,请考虑设置LD_DEBUG环境变量:libws2811.so:无法打开共享对象文件:没有这样的文件或目录

这告诉我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指令,将其复制到容器映像中。

最新更新