.NET 服务仅在 Docker 崩溃

.NET service crashes ONLY on Docker

我有一个 .NET 6 服务在我的本地 Windows 10 机器上运行良好。当我使用使用这些图像的多阶段 Docker 文件在 Docker 上部署它时:

mcr.microsoft.com/dotnet/aspnet:6.0-windowsservercore-ltsc2019 AS base  

mcr.microsoft.com/dotnet/sdk:6.0 AS build  

...无法加载我的服务加载的本机 DLL(准确地说是 Xbim.Geometry.Engine64)。

我收到错误:

System.IO.FileLoadException: Failed to load Xbim.Geometry.Engine64.dll
 ---> System.IO.FileNotFoundException: Could not load file or assembly 'Xbim.Geometry.Engine.dll, Culture=neutral, PublicKeyToken=null'. The specified module could not be found.
File name: 'Xbim.Geometry.Engine.dll, Culture=neutral, PublicKeyToken=null'

此 DLL 存在于我的 运行 目录中。

我将 working-fine 文件夹和我的二进制文件从我的本地机器复制到容器中,但出现了这个错误!当我将我的 failing 文件夹从我的容器复制到我的本地机器时 - 它成功了!

我做错了什么?我的容器中会不会遗漏了什么?

Xbim.Geometry.Engine64 程序集依赖于 Visual C++ 运行时库中的本机代码。默认情况下,ASP.NET Windows 服务器核心映像不包含这些库,因此 .NET 运行时在尝试加载程序集时失败,如问题所示。

我们可以通过安装 redistributable package:

将 Visual C++ 运行时文件添加到图像中
RUN powershell -Command Invoke-WebRequest \
    -Uri "https://aka.ms/vs/17/release/vc_redist.x64.exe" \
    -OutFile vc_redist.x64.exe \
 && vc_redist.x64.exe /install /quiet /norestart \
 && del /f vc_redist.x64.exe

有关此程序集的一些其他常见依赖性问题,请参阅 this comment