1

我正在尝试在 .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 文件夹中的各个位置 - 应该提到这一点。

4

1 回答 1

0

由于您是在 Windows 上编译,但使用的是 Linux 容器,因此您必须确保发布的是正确的运行时

首先,使用dotnet publish -r linux-x64. 您可能希望具体-o <path>以使其更容易找到。

然后,您可以使用Dockerfile.

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

于 2021-05-09T15:09:25.303 回答