【问题标题】:Using System.Drawing inside Docker在 Docker 中使用 System.Drawing
【发布时间】:2020-04-06 17:47:09
【问题描述】:

我已按照以下步骤操作:

  1. 在不支持 Docker 的情况下创建新的 ASP.NET Core MVC Web 应用程序

  2. 安装了System.Drawing.Common Nuget 包

  3. 添加一个名为TestImage.png的文件

  4. 使用以下代码成功访问文件:

    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);
    

    到目前为止的预期行为;这是有问题的一点:

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

  6. 运行项目(docker-compose 是启动项目)。我收到一个错误:

    DllNotFoundException:无法加载共享库“libdl”或其依赖项之一。为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量: liblibdl: cannot open shared object file: No such file or directory

我做了很多谷歌搜索,发现了这个:Unable to load DLL 'libdl' when using System.Drawing.Common NuGet package on AWS Lambda

这是我的 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 的情况下解决这个问题。

但是,它没有奏效。我该如何解决这个问题?

或者,有没有办法避免system.drawing?

【问题讨论】:

  • 我有相同的设置,它适用于 netcoreapp2.2,System.Drawing.Common 4.5.1。你在哪里添加 RUN 命令?如果您将其添加到上面的base,它应该可以工作。
  • 你解决了吗?我有一种感觉,您可能在错误的地方添加了这些行。您需要它们在“基础”/“最终”图像中可用。

标签: c# docker


【解决方案1】:

我已经设法让它发挥作用。 这就是我的 dockerfile 的样子:

(我使用的是 .net core 3.0,但它应该与 2.x 版本完美配合)

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 ...

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 2017-08-18
    • 2014-08-24
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多