【问题标题】:Adding onnxruntime Library to a .Net Core Docker Container for Linux将 onnxruntime 库添加到适用于 Linux 的 .Net Core Docker 容器
【发布时间】:2021-05-09 12:18:47
【问题描述】:

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

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"]

现在我想在我的服务器上添加一个预训练的 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,所以在弄清楚它应该如何工作时遇到了一些麻烦。不胜感激。

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

  <ItemGroup>
    <PackageReference Include="com.playfab.csharpgsdk" Version="0.10.200325" />
    <PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.7.0" />
  </ItemGroup>

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

【问题讨论】:

  • 在构建 docker 之前如何构建应用程序?
  • 嗨 - 已在帖子中添加了一些细节。如果需要更多详细信息,请告诉我。

标签: docker .net-core onnxruntime


【解决方案1】:

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

首先,使用dotnet publish -r linux-x64 发布。您可能需要指定 -o &lt;path&gt; 以便更容易找到。

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

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

【讨论】:

  • 谢谢!是的,似乎我需要包含一个单独的 Linux onnxruntime 库,而不是 Windows DLL。我还尝试在 Docker 映像中构建,并且效果也很好。感谢指导...
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 2020-05-27
  • 2018-06-14
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2020-11-04
相关资源
最近更新 更多