我应该安装哪些库才能在基于 Alpine 的图像中使用 ASP NET Core 应用程序中的 System.Drawing.Common

Which libraries should I install for work with System.Drawing.Common in ASP NET Core application inside Alpine-based image

我在 dotnet core 3.0 应用程序中有以下代码:

...
// This url returns image (Content-Type: Blob)
var imageUrl = "https://barcode.tec-it.com/barcode.ashx?data=ABC-abc-1234&code=Code128&dpi=96";
HttpClient client = HttpClientFactory.Create();
using (var input = await client.GetStreamAsync(imageUrl))
{
    var bitmap = new Bitmap(input); // this is dangerous code
}
...

我想 运行 这段代码放在 docker 容器中,它基于 alpine3.9 (mcr.microsoft.com/dotnet/core/aspnet:3.0.0-alpine3.9) 我知道我应该在 docker 容器中安装额外的库以使用 System.Drawing.Common:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0.0-alpine3.9
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
    && apk update \
    && apk add \
        libgdiplus

但无论如何 - 它失败并显示以下堆栈跟踪:

System.ArgumentException: Parameter is not valid.
   at System.Drawing.Image.InitializeFromStream(Stream stream)
   at System.Drawing.Bitmap..ctor(Stream stream)

我知道这段代码在基于 debian 的容器中运行良好,我是这样处理的:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    libgdiplus

我尝试在 alpine 容器中安装 libgdiplus-devfontconfigttf-dejavu 库,但它不起作用

所以主要问题 - 是库相关问题还是 dotnet 内部的错误?如果首先 - 我应该安装什么库才能正常工作?

TL;DR

https://barcode.tec-it.com/barcode.ashx?data=ABC-abc-1234&code=Code128&dpi=96 更改为 https://www.scandit.com/wp-content/themes/scandit/barcode-generator.php?symbology=code128&value=213214214&size=200&ec=L

描述

这是 dotnet 内部的错误 - https://github.com/dotnet/corefx/issues/41527 问题 link 生成 GIF - 它会导致问题。解决方法 - 使用 link 将生成 JPEG

对我来说,对 dockerfile 的以下修改有效(.net core 3.1)。注意runtime中添加了libgdiplus、libc-dev和libx11-dev:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.12 as builder
WORKDIR /app
COPY nuget.config nuget.config

RUN apk update
RUN apk add --update nodejs nodejs-npm

RUN cd XXX.XXXXXXX.YYYYYY && dotnet restore --configfile ../nuget.config && 
dotnet publish -c Release -o ../out/

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine3.12
WORKDIR /app

# Alpine 3.x Docker images no longer have tzdata package 
RUN apk update && \
apk add --no-cache tzdata

RUN apk add libgdiplus --repository https://dl-3.alpinelinux.org/alpine/edge/testing/
RUN apk add libc-dev libx11-dev

COPY --from=builder /app/out .
CMD ["dotnet", "XXX.XXXXXXX.YYYYYY"]