我应该安装哪些库才能在基于 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-dev
、fontconfig
和 ttf-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"]
我在 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-dev
、fontconfig
和 ttf-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"]