.NET SDK 9 AOT Chiseled镜像构建失败:无法安装curl
解决方案
问题根源
Chiseled 系列镜像属于微软推出的极简 distroless 镜像,没有预装 apt 等包管理工具,因此无法通过 apt-get 安装 curl。我们需要通过多阶段构建从其他镜像复制 curl 及其依赖库到目标镜像中,同时适配 AOT 编译的特性。
修正后的 Dockerfile
# 基础运行镜像(Chiseled 精简版,用于最终部署) FROM mcr.microsoft.com/dotnet/runtime-deps:9.0-noble-chiseled-extra AS base USER app WORKDIR /app EXPOSE 8080 # 从标准 Ubuntu 镜像获取 curl 及其依赖 FROM ubuntu:noble AS curl-source RUN apt-get update && apt-get install -y --no-install-recommends curl # 将 curl 和依赖库复制到基础镜像 FROM base AS base-with-curl USER root # 复制 curl 二进制文件 COPY --from=curl-source /usr/bin/curl /usr/bin/curl # 复制 curl 所需的所有依赖库(通过 ldd /usr/bin/curl 查看) COPY --from=curl-source /lib/x86_64-linux-gnu/libcurl.so.4 /lib/x86_64-linux-gnu/libcurl.so.4 COPY --from=curl-source /lib/x86_64-linux-gnu/libssl3.so /lib/x86_64-linux-gnu/libssl3.so COPY --from=curl-source /lib/x86_64-linux-gnu/libcrypto3.so /lib/x86_64-linux-gnu/libcrypto3.so COPY --from=curl-source /lib/x86_64-linux-gnu/libz.so.1 /lib/x86_64-linux-gnu/libz.so.1 COPY --from=curl-source /lib/x86_64-linux-gnu/libnghttp2.so.14 /lib/x86_64-linux-gnu/libnghttp2.so.14 COPY --from=curl-source /lib/x86_64-linux-gnu/libidn2.so.0 /lib/x86_64-linux-gnu/libidn2.so.0 COPY --from=curl-source /lib/x86_64-linux-gnu/libunistring.so.2 /lib/x86_64-linux-gnu/libunistring.so.2 COPY --from=curl-source /lib/x86_64-linux-gnu/libpsl.so.5 /lib/x86_64-linux-gnu/libpsl.so.5 COPY --from=curl-source /lib/x86_64-linux-gnu/libbrotlidec.so.1 /lib/x86_64-linux-gnu/libbrotlidec.so.1 COPY --from=curl-source /lib/x86_64-linux-gnu/libbrotlicommon.so.1 /lib/x86_64-linux-gnu/libbrotlicommon.so.1 COPY --from=curl-source /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 COPY --from=curl-source /lib/x86_64-linux-gnu/libkrb5.so.3 /lib/x86_64-linux-gnu/libkrb5.so.3 COPY --from=curl-source /lib/x86_64-linux-gnu/libk5crypto.so.3 /lib/x86_64-linux-gnu/libk5crypto.so.3 COPY --from=curl-source /lib/x86_64-linux-gnu/libcom_err.so.2 /lib/x86_64-linux-gnu/libcom_err.so.2 COPY --from=curl-source /lib/x86_64-linux-gnu/libkrb5support.so.0 /lib/x86_64-linux-gnu/libkrb5support.so.0 COPY --from=curl-source /lib/x86_64-linux-gnu/libkeyutils.so.1 /lib/x86_64-linux-gnu/libkeyutils.so.1 COPY --from=curl-source /lib/x86_64-linux-gnu/libresolv.so.2 /lib/x86_64-linux-gnu/libresolv.so.2 USER app # AOT 构建阶段 FROM mcr.microsoft.com/dotnet/nightly/sdk:9.0-noble-aot AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["CommonLibrary.Api/CommonLibrary.Api.csproj", "CommonLibrary.Api/"] COPY ["CommonLibrary.Common/CommonLibrary.Common.csproj", "CommonLibrary.Common/"] COPY ["CommonLibrary.Model/CommonLibrary.Model.csproj", "CommonLibrary.Model/"] COPY ["CommonLibrary.Database/CommonLibrary.Database.csproj", "CommonLibrary.Database/"] RUN dotnet restore "./CommonLibrary.Api/CommonLibrary.Api.csproj" COPY . . WORKDIR "/src/CommonLibrary.Api" RUN dotnet build "./CommonLibrary.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build # AOT 发布阶段(生成独立可执行文件) FROM build AS publish ARG BUILD_CONFIGURATION=Release # 移除 UseAppHost=false,AOT 默认生成独立可执行文件 RUN dotnet publish "./CommonLibrary.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish # 最终镜像(集成 curl + AOT 可执行文件) FROM base-with-curl AS final WORKDIR /app COPY --from=publish /app/publish . # AOT 编译后生成与项目同名的可执行文件,直接启动 ENTRYPOINT ["./CommonLibrary.Api"]
Docker Compose 配置(docker-compose.yml)
version: '3.8' services: commonlibrary-api: build: context: . dockerfile: Dockerfile args: BUILD_CONFIGURATION: Release ports: - "8080:8080" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"] interval: 30s timeout: 10s retries: 3 start_period: 40s
关键说明
- curl 安装方式:通过多阶段构建从标准 Ubuntu 镜像复制 curl 二进制文件及其所有依赖库,避开 Chiseled 镜像无包管理工具的限制。
- AOT 适配:移除发布阶段的
/p:UseAppHost=false参数,AOT 编译默认生成独立可执行文件,无需依赖 dotnet 运行时,直接启动即可。 - 健康检查:使用 curl 访问 WebAPI 的健康检查端点(需确保你的 API 已配置
/healthz这类健康检查接口)。
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

