是否可以在 windows docker 容器中的 dotnet 核心应用 运行 中使用 EPPlus?

Is it possible to use EPPlus in dotnet core app running in a windows docker container?

我有一个 dotnet core 2.1 web api,它有一个生成 .xlsx 电子表格的操作。它创建一个浏览器随后可以处理的 FileStreamResult。生成电子表格的代码如下:

using (var excelFile = new ExcelPackage())
using (var worksheet = excelFile.Workbook.Worksheets.Add("Sheet 1"))
{
    ...
    //insert data into worksheet

    return new FileStreamResult(new MemoryStream(excelFile.GetAsByteArray()), "application/octet-stream") { FileDownloadName = "Report.xlsx" };
}

在 IIS 中托管它工作正常,并将生成电子表格。 当我在 windows docker 容器中托管应用程序时,特别是图像:microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016 我在尝试生成报告时遇到以下异常:

System.TypeInitializationException: The type initializer for 'Gdip' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'gdiplus.dll'

经过一番研究后,我意识到 gdiplus 不存在于 nanoserver 映像中。

是否可以使用 EPPlus 在 nanoserver 映像中托管的 dotnet 核心应用程序上创建电子表格?还是我必须使用另一个库来生成 xlsx?如果可能的话,我想使用 EPPlus。我不能使用 linux 容器(不幸的是现在)

我不知道它是否有效,但请尝试注释掉库中使用 System.Drawing.Common 的任何方法,例如 AutoFitColumns()。这就是导致它在我的 linux 容器上损坏的原因。

您可以构建自己的 ubtuntu/dotnetcore 图像!我只是为这个问题自己做的。

从命令行:

docker pull ubuntu

docker run -t -t ubuntu:latest /bin/bash -> to open a container shell ->

    apt-get update

    apt-get install wget    

    wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

    dpkg -i packages-microsoft-prod.deb

    apt-get install apt-transport-https

    apt-get update

    apt-get install dotnet-sdk-2.2

安装解决System.Drawing/EPPlus问题所需的特殊库:

    apt-get install libgdiplus

    cd /usr/lib

    ln -s libgdiplus.so gdiplus.dll

    apt-get install libc6-dev libx11-dev

    rm -rf /var/lib/apt/lists/*

second 命令行中找到容器进程 ID window 并提交镜像:

docker ps 


    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    4975113bb79        ubuntu:latest       "/bin/bash"         9 minutes ago       Up 9 minutes                            infallible_poincare

docker commit d497 custom/imagename:dotnetcore-2.2-custom

docker ps kill d497

docker image rm ubuntu

现在你有一个自定义 ubuntu 图像(与 dotnetcore 使用的图像相同),其中加载了 sdk 和你需要的库来阻止错误。

图像可能会被削减很多,请注意,这是我第一次成功尝试解决这个问题,而我在网上找到的其他方法由于公司防火墙限制等原因没有成功。