在Docker上运行Linux ARM64版IronPDF
IronPDF 的渲染器基于 Chromium Embedded Framework (CEF),它需要比 Linux 动态链接器默认在 ARM 和 ARM64 上预留的更多线程本地存储(TLS)。没有解决方法的话,加载 libcef.so 会在 cannot allocate memory in static TLS block 时失败。 解决方法是通过 LD_PRELOAD 环境变量预加载 libcef.so,以便链接器在加载其他任何内容之前预留足够的 TLS。
有关裸错误消息和非Docker修复的详细信息,请参阅Linux ARM上IronPDF:无法在静态TLS块中分配内存。 本文适用于在容器内应用同样的修复。
在Dockerfile中设置LD_PRELOAD
将变量添加为 ENV 指令,指向 IronPDF 附带的 ARM64 本机库:
ENV LD_PRELOAD=/app/runtimes/linux-arm64/native/libcef.so
示例Dockerfile
这个多阶段 Dockerfile 在 .NET 8 上为 ARM64 构建并运行 IronPDF 应用,安装 CEF 所依赖的本机库,并在最终映像中设置 LD_PRELOAD:
# Base image for runtime (ARM64)
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER root
WORKDIR /app
RUN apt update \
&& apt install -y sudo libxkbcommon-x11-0 libc6 libc6-dev libgtk2.0-0 libnss3 libatk-bridge2.0-0 libx11-xcb1 libxcb-dri3-0 libdrm-common libgbm1 libasound2 libxrender1 libfontconfig1 libxshmfence1 libgdiplus libva-dev
# Base image for build (ARM64)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish
# Final image with IronPdf and system dependencies
FROM base AS final
WORKDIR /app
ENV LD_PRELOAD=/app/runtimes/linux-arm64/native/libcef.so
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "IronPdfLinuxArm.dll"]
将 LD_PRELOAD 设置为 libcef.so 实际落在您镜像中的路径; 上面的值与默认的 runtimes/linux-arm64/native/ 布局匹配。 基础限制在CEF论坛上得到追踪。

