.net core System.DllNotFoundException无法加载DLL';gdiplus.dll';Windows容器中的错误

.net core System.DllNotFoundException无法加载DLL';gdiplus.dll';Windows容器中的错误,.net-core,gdi+,docker-image,windows-container,.net Core,Gdi+,Docker Image,Windows Container,我们正在使用Kubernetes(Amazon EKS)在windows容器上运行.Net核心控制台应用程序。主机操作系统为Windows Server 2016。由Aspose.Cells生成excel文件时出现以下错误 System.TypeInitializationException: The type initializer for 'Gdip' threw an exception. ---> System.DllNotFoundException: Unable to l

我们正在使用Kubernetes(Amazon EKS)在windows容器上运行.Net核心控制台应用程序。主机操作系统为Windows Server 2016。由Aspose.Cells生成excel文件时出现以下错误

System.TypeInitializationException: The type initializer for 'Gdip' threw an exception.   --->
System.DllNotFoundException: Unable to load DLL 'gdiplus.dll' or one of its dependencies: 
The specified module could not be found.
正如本文所建议的,尝试使用windows映像,以便GDI库在容器中可用,但它不起作用。下面是docker文件

FROM mcr.microsoft.com/windows:1809
FROM mcr.microsoft.com/dotnet/runtime:5.0
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
COPY ./ /App/WS
WORKDIR /App/WS
ENTRYPOINT ["dotnet", "AppService.dll"]
也尝试了下面的图片,但没有运气

FROM mcr.microsoft.com/dotnet/aspnet:5.0
FROM mcr.microsoft.com/dotnet/sdk:5.0


linux容器有显式安装gdiPlus库的选项,但在windows容器中找不到类似的选项。目前,我们希望只在windows容器上部署我们的应用程序。谢谢你的帮助

默认情况下,
5.0
标记在针对Windows容器时为您提供Windows Nano Server。Windows的此SKU已精简,不包含gdiplus.dll。您需要的是具有该DLL的Windows Server Core。此处记录了这一点:

根据我看到您引用的其他标记,您的目标似乎是用于容器的Windows Server 2019。幸运的是,.NET确实为Windows Server Core 2019提供了.NET 5.0映像。要使用的标记是
5.0-windowsservercore-ltsc2019
。您可以在中找到此列表。这将是解决此问题的建议标记

我怀疑您是否实际使用Windows Server 2016作为主机环境。没有任何版本的Windows Server能够使用比主机版本更新的Windows版本运行容器。此处描述了此Windows容器版本兼容性矩阵:

我对Dockerfile的内容也有点困惑,因为您一直在从指令中连续列出两个
。例如,您发布了以下内容:

FROM mcr.microsoft.com/windows:1809
FROM mcr.microsoft.com/dotnet/runtime:5.0
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
COPY ./ /App/WS
WORKDIR /App/WS
ENTRYPOINT ["dotnet", "AppService.dll"]

来自
的第一条
指令对生成的图像没有影响。获取输出的映像中根本不使用
mcr.microsoft.com/windows:1809
base,因为它后面紧跟着一条
FROM
指令。似乎您正试图拉下
mcr.microsoft.com/windows:1809
映像,以用作
mcr.microsoft.com/dotnet/runtime:5.0
映像的基础,但它不是这样工作的。我鼓励你们仔细阅读Dockerfile结构。您还可能有兴趣了解如何将.NET安装到.NET不提供官方映像的其他映像类型上。这似乎是你在这里想要做的。但是,关于如何做到这一点,有官方的指导。基本上,您可以像使用
mcr.microsoft.com/windows:1809那样使用基本映像,并从其zip文件显式安装.NET。

谢谢您的详细解释!
FROM mcr.microsoft.com/windows:1809
FROM mcr.microsoft.com/dotnet/runtime:5.0
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
COPY ./ /App/WS
WORKDIR /App/WS
ENTRYPOINT ["dotnet", "AppService.dll"]