将 onnxruntime 库添加到适用于 Linux 的 .Net Core Docker 容器

问题描述

我正在尝试在用于 Linux 部署的 .NET 5.0 Docker 容器上部署游戏服务器。我当前的 Dockerfile 看起来像这样,到目前为止它一直运行良好。我的代码被打包到一个位于 Darkrift_Server_Local/Plugins 文件夹中的 dll 中。 Darkrift.Server.Console.dll 是加载插件并运行我的逻辑的第三方网络包装器:

import seaborn as sns

df = sns.load_dataset("tips")
ax = sns.barplot(x="day",y="total_bill",data=df)
ax.xaxis.label.set_visible(False)

现在我想向我的服务器添加一个预训练的 ONNX 模型,供 AI 对手使用。我已将 microsoft.ml.OnnxRuntime Nuget 包添加到我的项目中,当我在 Windows 10 上运行它时,我的代码可以正常工作(使用 Powershell 执行 Darkrift.Server.Console.dll)。

但是,我无法在 Docker 容器中执行此操作,因为它无法找到 onnxruntime.dll 文件。具体错误如下:

System.TypeInitializationException:类型初始值设定项 “microsoft.ml.OnnxRuntime.NativeMethods”引发异常。

---> System.DllNotFoundException:无法加载共享库“onnxruntime”或其依赖项之一。

我已经尝试将构建过程中生成的 onnxruntime.dll 文件复制到 Darkrift_Server_Local 文件夹中的不同位置,但没有成功。我是 Docker 的新手,几年后又回到了 .NET,所以在弄清楚它应该如何工作时有点麻烦。希望对此有任何指导。

编辑:回应评论。我正在使用 VS2019 和 Release/Any cpu 构建项目。包包含代码如下:

FROM mcr.microsoft.com/dotnet/runtime:5.0
copY DarkRift_Server_Local/ App/
EXPOSE 4296/udp
EXPOSE 4296/tcp
workdir /App
ENTRYPOINT ["dotnet","./Lib/DarkRift.Server.Console.dll"]

我还尝试使用 dotnet publish -c Release 并将在发布文件夹中创建的运行时文件夹复制到我的 Darkrift_Server_Local 文件夹中的不同位置 - 应该提到这一点。

解决方法

由于您是在 Windows 上编译,但使用的是 Linux 容器,因此您必须确保您是 publishing for the correct runtime

首先,使用 dotnet publish -r linux-x64 发布。您可能希望指定 -o <path> 以使其更易于查找。

然后,您可以使用 Dockerfile 复制图像中的那些内容。

或者,您可以在您的 Dockerfile 本身中构建/发布以避免此类平台问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...