adi*_*tya 3 c# openshift docker .net-core alpine-linux
我正在 openshift 上运行 dotnet core 2.2 Web api,我有一个返回 FileResult 的 api 方法。该文件是使用 epplus 生成的。但是,在容器化应用程序后,端点返回以下错误。我相信如果使用 system.drawing 库,就会出现此异常,但是我没有使用任何 system.drawing 功能。
System.TypeInitializationException:“Gdip”的类型初始值设定项引发异常。---> System.DllNotFoundException: 无法加载 DLL 'libgdiplus': 找不到指定的模块。
public async Task<FileResult> GetPSACostCaseAndFeedData([FromQuery] int caseId, [FromQuery] int proposalId, [FromQuery] int equipmentId)
{
try
{
var queryParams = new Dictionary<string, string> { { "caseId", caseId.ToString() }, { "proposalId", proposalId.ToString() }, { "equipmentId", equipmentId.ToString() } };
var restObj = _restFactory.createRestRequest(Method.GET, "ProposalService/PSACostData/GetPSACostCaseAndFeedData", queryParams);
Console.WriteLine("Base URL - " + restObj.Item2.BaseUrl);
var response = await restObj.Item2.ExecuteTaskAsync(restObj.Item1);
if (response.StatusCode == HttpStatusCode.OK)
{
var result = JsonConvert.DeserializeObject<PSACostCaseDetailsResponse>(response.Content);
Console.WriteLine("result -" + response.Content.ToString());
Console.WriteLine("start writing file");
var excelPackage = await _iPSACostExcelHelper.PopulatePsaCostFile(result, Path.Combine(_hostingEnvironment.ContentRootPath, "App_data", "PSACOST_V9.2.2.xlsm"));
Console.WriteLine("finished writing file");
return await Task.FromResult(File(_excelHelper.ConvertWorkBookToByteArray(excelPackage), ContentTypeEnums.excel, result.customerInformationModel.ProposalNum + "_" + result.caseDataModel.CaseNm + ".xlsm"));
}
throw new Exception("There is no PSA cost data for this case");
}
Run Code Online (Sandbox Code Playgroud)
“完成写入文件”行确实被打印到标准输出,之后的行失败。有人可以帮助我理解这里出了什么问题吗?为什么返回FileResult类型的方法需要system.drawing?
下面还有我的 dockerfile。
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2.7-alpine3.10
LABEL pipelineName="PSACOST.API" \
pipelineKey="UMAOKJOH" \
offeringKey="KKWEECBH"
RUN apk upgrade -U
EXPOSE 5000
ENV ASPNETCORE_URLS=http://*:5000
WORKDIR /app
COPY . /app
USER guest
ENTRYPOINT ["dotnet", "PSACOST.API.Web.dll"]
Run Code Online (Sandbox Code Playgroud)
System.Drawing当我使用生成二维码的库时,我遇到了类似的情况。
问题似乎是 DotNet Core docker 映像、sdk 或运行时没有libgdiplus. 对于 Linux 来说这不是问题,因为您可以apt-get install -y libgdiplus在容器中执行类似操作,或者使用 DotNetCore 运行时映像加上 this 来构建应用程序 docker 映像libgdiplus。
这是一个烦人的问题。我不确定是否有任何解决方案不需要弄乱官方的 docker 镜像,但到目前为止还没有运气。
目前我可以看到一些解决方案选项。
选项 A:
如果您使用适用于 Linux 的 docker DotNetCore 映像(看起来如此),请使用 apt 安装缺少的运行时依赖项,例如libgdiplus因为它们不是 docker 映像的一部分。
选项 B: 找到一个良好的 docker DotNetCore 映像(sdk 或运行时),其中包含所有这些依赖项
选项 C:epplus查找除不依赖于System.Drawings
之外的其他库libgdiplus。但我什至不知道这是否可能
更新 1
对于选项 B,您可以尝试使用以下包含 aspnet core 运行时 + 您需要的依赖项的 docker 映像:
lonwern/aspnetcore-libgdiplus:2.1
有关如何生成图像(如果您选择选项 A)的更多信息,请参阅此处的创建方式:https: //hub.docker.com/r/lonwern/aspnetcore-libgdiplus/dockerfile
更新 2
我创建了包含 DotNet Core SDK 和 AspNet Core plus 的公共 Docker 映像,以便在运行与 SDK DotNet Core CLI 一起libgdiplus使用的应用程序时使用它们(例如:dotnet vstest、dotnet test 等)System.Drawing或与运行时。
https://hub.docker.com/repository/docker/sunnyatticsoftware/dotnet-core-sdk-libgdiplus
https://hub.docker.com/repository/docker/sunnyatticsoftware/dotnet-core-aspnet-libgdiplus
有关存储库本身的更多信息。
我在 CI/CD 管道和 Web 应用程序的最终 Docker 映像中使用它们,以避免这些运行时异常。
| 归档时间: |
|
| 查看次数: |
3982 次 |
| 最近记录: |