C# 在Docker内部使用System.Drawing

C# 在Docker内部使用System.Drawing,c#,docker,C#,Docker,我采取了以下步骤: 在不支持Docker的情况下创建新的ASP.NET核心MVC web应用程序 安装了System.Drawing.CommonNuget软件包 添加名为TestImage.png的文件 使用以下代码成功访问该文件: byte[] imageLoaded = System.IO.File.ReadAllBytes("TestImage.png"); Image image; using (MemoryStream mStream = new MemoryStream(imag

我采取了以下步骤:

  • 在不支持Docker的情况下创建新的ASP.NET核心MVC web应用程序

  • 安装了
    System.Drawing.Common
    Nuget软件包

  • 添加名为
    TestImage.png的文件

  • 使用以下代码成功访问该文件:

    byte[] imageLoaded = System.IO.File.ReadAllBytes("TestImage.png");
    Image image;
    
    using (MemoryStream mStream = new MemoryStream(imageLoaded))
    {
        image = Image.FromStream(mStream);
    }
    
    var image2 = new Bitmap(image);
    image2.Save("TestImage1.png", ImageFormat.Png);
    
    迄今为止的预期行为;以下是有问题的一点:

  • 右键单击解决方案并选择:添加容器编排支持/Docker Compose/Linux(目标操作系统)

  • 运行项目(docker compose是启动项目)。我得到一个错误:

    DllNotFoundException:无法加载共享库“libdl”或其依赖项之一。为了帮助诊断加载问题,请考虑设置LDYDebug环境变量:LyReBDL:无法打开共享对象文件:没有这样的文件或目录

  • 我在谷歌上搜索了很多次,发现如下:

    这是我的Dockerfile:

    FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
    WORKDIR /app
    EXPOSE 80
    
    FROM microsoft/dotnet:2.2-sdk AS build
    WORKDIR /src
    COPY WebApplication1/WebApplication1.csproj WebApplication1/
    RUN dotnet restore WebApplication1/WebApplication1.csproj
    COPY . .
    WORKDIR /src/WebApplication1
    RUN dotnet build WebApplication1.csproj -c Release -o /app
    
    FROM build AS publish
    RUN dotnet publish WebApplication1.csproj -c Release -o /app
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app .
    ENTRYPOINT ["dotnet", "WebApplication1.dll"]
    
    我尝试添加以下行:

    # install System.Drawing native dependencies
    RUN apt-get update \
        && apt-get install -y --allow-unauthenticated \
            libc6-dev \
            libgdiplus \
            libx11-dev \
         && rm -rf /var/lib/apt/lists/*
    
    然而,这并没有什么不同。我怎样才能解决这个问题?或者是否有其他方法可以在不使用System.Drawing.Common的情况下实现这一点

    然而,它没有起作用。我怎样才能解决这个问题


    或者,有没有一种方法可以对这个系统进行编码。绘图?

    我已经设法使它工作了。 以下是我的dockerfile的外观:

    (我使用的是.NETCore3.0,但它在2.x版本中应该可以正常工作)


    我希望这有帮助。

    我有相同的设置,它适用于netcoreapp2.2、System.Drawing.Common 4.5.1。您在哪里添加了RUN命令?如果您将其添加到上面的
    基础
    ,它应该可以工作。您解决了这个问题吗?我有一种感觉,你可能在错误的地方添加了这些行。您需要它们在“基本”/“最终”图像中可用。
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
    RUN apt-get update \ 
        && apt-get install -y --no-install-recommends libgdiplus libc6-dev \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
    RUN cd /usr/lib && ln -s libgdiplus.so gdiplus.dll
    WORKDIR /app
    
    ... the rest of your dockerfile ...