在.NET 6 Alpine Linux容器部署SkiaSharp遇运行时错误求助
.NET 6.0部署SkiaSharp到Alpine Linux容器运行失败问题及解决办法
问题现象
运行阶段出现失败,错误信息如下:
System.TypeInitializationException: 'SkiaSharp.SKImageInfo'的类型初始值设定项引发异常。
---> System.DllNotFoundException: 无法加载共享库'libSkiaSharp'或其依赖项。若要诊断加载问题,可设置LD_DEBUG环境变量:liblibSkiaSharp: 无法打开共享对象文件: 没有该文件或目录
at SkiaSharp.SkiaApi.sk_colortype_get_default_8888()
at SkiaSharp.SKImageInfo..cctor()
--- 内部异常堆栈跟踪结束 ---
at ZXing.SkiaSharp.Rendering.SKBitmapRenderer.Render(BitMatrix matrix, BarcodeFormat format, String content, EncodingOptions options)
at ZXing.BarcodeWriter`1.Write(String contents)
已尝试的无效方案
- 添加
SkiaSharp.NativeAssets.Linux引用 - 替换为
SkiaSharp.NativeAssets.Linux.NoDepedencies引用 - 替换为
StoneCold.SkiaSharp.NativeAssets.AlpineLinux引用 - 将版本从2.88.3回退到2.80.3
- 复制libSkiaSharp.so到/usr/lib/目录
- 将发布目录添加到LD_LIBRARY_PATH
项目文件片段
<ItemGroup> <PackageReference Include="SkiaSharp" Version="2.80.3" /> <PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.80.3" /> ... </ItemGroup>
原Dockerfile(简化版)
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build WORKDIR /src COPY . . WORKDIR "/src/Web" RUN dotnet build "Web.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Web.csproj" -c Release -o /app/publish -r alpine-x64 --no-self-contained FROM base AS final RUN apt-get update \ && apt-get install -y libfontconfig1 fontconfig \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/publish/ WORKDIR /app COPY --from=publish /app/publish . COPY --from=publish /app/publish/libSkiaSharp.so /usr/lib/ ENV ASPNETCORE_URLS=http://*:5000 ENTRYPOINT ["dotnet", "Web.dll"]
可行解决方案(感谢@omajid)
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS base WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build WORKDIR /src COPY . . WORKDIR "/src/Web" RUN dotnet build "Web.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Web.csproj" -c Release -o /app/publish -r linux-musl-x64 --no-self-contained FROM base AS final RUN apk update \ && apk --no-cache add icu-libs fontconfig ttf-dejavu WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS=http://*:5000 ENV DOTNET_RUNNING_IN_CONTAINER=true ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false ENTRYPOINT ["dotnet", "Web.dll"]
内容的提问来源于stack exchange,提问作者codemonkeh
相关产品推荐
相关产品推荐

