将 onnxruntime 库添加到 Linux 的 .Net Core Docker 容器
Adding onnxruntime Library to a .Net Core Docker Container for Linux
我正在尝试在 .NET 5.0 Docker 容器上部署游戏服务器以进行 Linux 部署。我当前的 Docker 文件看起来像这样,到目前为止它运行良好。我的代码被打包到 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: The type initializer for
'Microsoft.ML.OnnxRuntime.NativeMethods' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'onnxruntime' or one of its dependencies.
我已经尝试将构建期间生成的 onnxruntime.dll 文件复制到 Darkrift_Server_Local 文件夹中的不同位置,但它一直没有工作。我是 Docker 的新手,几年后又回到了 .NET,所以在弄清楚它应该如何工作时遇到了一些麻烦。将不胜感激。
编辑:回应评论。我正在使用 VS2019 和 Release/Any CPU 构建项目。包内含代码如下:
<ItemGroup>
<PackageReference Include="com.playfab.csharpgsdk" Version="0.10.200325" />
<PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.7.0" />
</ItemGroup>
我也尝试过使用 dotnet publish -c Release 并将发布文件夹中创建的 运行times 文件夹复制到我的 Darkrift_Server_Local 文件夹中的不同位置 - 应该提到这一点。
由于您是在 Windows 上编译,但使用 Linux 容器,因此您必须确保您是 publishing for the correct runtime。
首先,用 dotnet publish -r linux-x64
发布。您可能需要具体 -o <path>
以便于查找。
然后您可以使用 Dockerfile
.
复制图像中的那些内容
或者,您可以 build/publish 在您的 Dockerfile
本身中以避免此类平台问题。
我正在尝试在 .NET 5.0 Docker 容器上部署游戏服务器以进行 Linux 部署。我当前的 Docker 文件看起来像这样,到目前为止它运行良好。我的代码被打包到 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: The type initializer for 'Microsoft.ML.OnnxRuntime.NativeMethods' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'onnxruntime' or one of its dependencies.
我已经尝试将构建期间生成的 onnxruntime.dll 文件复制到 Darkrift_Server_Local 文件夹中的不同位置,但它一直没有工作。我是 Docker 的新手,几年后又回到了 .NET,所以在弄清楚它应该如何工作时遇到了一些麻烦。将不胜感激。
编辑:回应评论。我正在使用 VS2019 和 Release/Any CPU 构建项目。包内含代码如下:
<ItemGroup>
<PackageReference Include="com.playfab.csharpgsdk" Version="0.10.200325" />
<PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.7.0" />
</ItemGroup>
我也尝试过使用 dotnet publish -c Release 并将发布文件夹中创建的 运行times 文件夹复制到我的 Darkrift_Server_Local 文件夹中的不同位置 - 应该提到这一点。
由于您是在 Windows 上编译,但使用 Linux 容器,因此您必须确保您是 publishing for the correct runtime。
首先,用 dotnet publish -r linux-x64
发布。您可能需要具体 -o <path>
以便于查找。
然后您可以使用 Dockerfile
.
或者,您可以 build/publish 在您的 Dockerfile
本身中以避免此类平台问题。