You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

关键说明

  1. curl 安装方式:通过多阶段构建从标准 Ubuntu 镜像复制 curl 二进制文件及其所有依赖库,避开 Chiseled 镜像无包管理工具的限制。
  2. AOT 适配:移除发布阶段的 /p:UseAppHost=false 参数,AOT 编译默认生成独立可执行文件,无需依赖 dotnet 运行时,直接启动即可。
  3. 健康检查:使用 curl 访问 WebAPI 的健康检查端点(需确保你的 API 已配置 /healthz 这类健康检查接口)。

内容的提问来源于stack exchange,提问作者Fernando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:47:03