System.DllNotFoundException 无法在 Windows 容器中加载 DLL 'gdiplus.dll' 错误
System.DllNotFoundException Unable to load DLL 'gdiplus.dll' error in a Windows container
我们是 运行 一个 .Net 核心控制台应用程序,位于 windows 带有 Kubernetes (Amazon EKS) 的容器上。主机 OS 是 Windows Sever 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.
正如此 link 中所建议的那样,尝试使用 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
和
FROM mcr.microsoft.com/windows/servercore:ltsc2019
FROM mcr.microsoft.com/dotnet/runtime:5.0
linux 容器有显式安装 gdiPlus 库的选项,找不到 windows 容器的类似选项。目前我们希望仅在 windows 个容器上部署我们的应用程序。感谢任何帮助!
默认情况下,当目标 Windows 容器时,5.0
标签为您提供 Windows Nano Server。此 Windows 的 SKU 已被精简,不包含 gdiplus.dll。相反,您想要的是 Windows Server Core,它确实具有该 DLL。这记录在这里:https://github.com/dotnet/dotnet-docker/blob/main/documentation/scenarios/using-system-drawing-common.md.
根据我看到您引用的其他标签,您似乎将 Windows Server 2019 用于您的容器。幸运的是,.NET 确实为 Windows Server Core 2019 提供了 .NET 5.0 图像。为此使用的标记是 5.0-windowsservercore-ltsc2019
。您可以在 https://hub.docker.com/_/microsoft-dotnet-runtime 中找到此列表。这将是用于解决此问题的推荐标签。
我怀疑您是否真的在使用 Windows Server 2016 作为主机环境。 Windows 服务器的任何版本都无法使用比主机版本更新的 Windows 版本的 运行 容器。 Windows 容器版本兼容性矩阵描述如下:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2016%2Cwindows-10-20H2.
我对你的 Dockerfile 的内容也有点困惑,因为你一直在列出两个连续的 FROM
指令。例如,您发布了这个:
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/windows:1809
基数在获取输出的图像中根本没有使用,因为您在它之后有一个后续的 FROM
指令。您似乎在尝试下拉 mcr.microsoft.com/windows:1809
图像以用作 mcr.microsoft.com/dotnet/runtime:5.0
图像的基础,但这不是它的工作原理。我鼓励您阅读 Dockerfile 结构。您可能还有兴趣了解将 .NET 安装到 .NET 未为其提供官方图像的其他图像类型的方法。这有点像你想在这里做的。但是在 https://github.com/dotnet/dotnet-docker/blob/main/documentation/scenarios/installing-dotnet.md 上有关于如何做到这一点的官方指导。基本上,您将像使用 mcr.microsoft.com/windows:1809
一样使用基础映像,并从其 zip 文件显式安装 .NET。
我们是 运行 一个 .Net 核心控制台应用程序,位于 windows 带有 Kubernetes (Amazon EKS) 的容器上。主机 OS 是 Windows Sever 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.
正如此 link 中所建议的那样,尝试使用 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
和
FROM mcr.microsoft.com/windows/servercore:ltsc2019
FROM mcr.microsoft.com/dotnet/runtime:5.0
linux 容器有显式安装 gdiPlus 库的选项,找不到 windows 容器的类似选项。目前我们希望仅在 windows 个容器上部署我们的应用程序。感谢任何帮助!
默认情况下,当目标 Windows 容器时,5.0
标签为您提供 Windows Nano Server。此 Windows 的 SKU 已被精简,不包含 gdiplus.dll。相反,您想要的是 Windows Server Core,它确实具有该 DLL。这记录在这里:https://github.com/dotnet/dotnet-docker/blob/main/documentation/scenarios/using-system-drawing-common.md.
根据我看到您引用的其他标签,您似乎将 Windows Server 2019 用于您的容器。幸运的是,.NET 确实为 Windows Server Core 2019 提供了 .NET 5.0 图像。为此使用的标记是 5.0-windowsservercore-ltsc2019
。您可以在 https://hub.docker.com/_/microsoft-dotnet-runtime 中找到此列表。这将是用于解决此问题的推荐标签。
我怀疑您是否真的在使用 Windows Server 2016 作为主机环境。 Windows 服务器的任何版本都无法使用比主机版本更新的 Windows 版本的 运行 容器。 Windows 容器版本兼容性矩阵描述如下:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2016%2Cwindows-10-20H2.
我对你的 Dockerfile 的内容也有点困惑,因为你一直在列出两个连续的 FROM
指令。例如,您发布了这个:
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/windows:1809
基数在获取输出的图像中根本没有使用,因为您在它之后有一个后续的 FROM
指令。您似乎在尝试下拉 mcr.microsoft.com/windows:1809
图像以用作 mcr.microsoft.com/dotnet/runtime:5.0
图像的基础,但这不是它的工作原理。我鼓励您阅读 Dockerfile 结构。您可能还有兴趣了解将 .NET 安装到 .NET 未为其提供官方图像的其他图像类型的方法。这有点像你想在这里做的。但是在 https://github.com/dotnet/dotnet-docker/blob/main/documentation/scenarios/installing-dotnet.md 上有关于如何做到这一点的官方指导。基本上,您将像使用 mcr.microsoft.com/windows:1809
一样使用基础映像,并从其 zip 文件显式安装 .NET。