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

Docker构建.Net 8项目报错NU1301:无法加载NuGet服务索引

问题描述

在Ubuntu Server上基于.NET 8编写项目并通过Dockerfile构建镜像时,出现错误:

error NU1301: Unable to load the service index for source https://api.nuget.org/v3/index.json.

现象细节:

  • 仅包含csproj和Program.cs的空控制台项目可正常构建
  • 无依赖的类库项目构建时触发上述错误
  • 直接在服务器上执行dotnet publish命令无此问题
  • 曾尝试将.NET版本改回7、卸载重装dotnet,均未解决问题

Dockerfile内容:

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# One of the library projects
COPY Domain Domain
RUN dotnet publish "Domain/Domain.csproj" -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS final
WORKDIR /app
EXPOSE 1883
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "Firebase.dll"]

类库项目csproj内容:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>
解决思路与方案
  • 排查容器内网络连通性:在Dockerfile的build阶段添加网络测试命令,验证能否访问NuGet源:

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    WORKDIR /src
    RUN curl -v https://api.nuget.org/v3/index.json  # 添加此行测试网络
    COPY Domain Domain
    RUN dotnet publish "Domain/Domain.csproj" -c Release -o /app/publish
    

    如果是DNS解析问题,构建时指定DNS服务器:

    docker build --dns 8.8.8.8 .
    
  • 显式指定NuGet源:在dotnet publish命令中直接指定源,避免容器内NuGet配置异常:

    RUN dotnet publish "Domain/Domain.csproj" -c Release -o /app/publish --source https://api.nuget.org/v3/index.json
    

    或者在项目根目录添加NuGet.config文件,内容如下,然后复制到容器中:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <packageSources>
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
      </packageSources>
    </configuration>
    

    在Dockerfile中添加复制命令:

    COPY NuGet.config .
    
  • 清理Docker构建缓存:缓存的镜像层可能存在异常,强制重新构建:

    docker build --no-cache .
    
  • 更新.NET SDK镜像:拉取最新的官方SDK镜像,避免旧镜像存在网络或配置问题:

    docker pull mcr.microsoft.com/dotnet/sdk:8.0
    
  • 拆分restore与publish步骤:将restore和publish分开执行,便于定位问题:

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    WORKDIR /src
    COPY Domain Domain
    RUN dotnet restore "Domain/Domain.csproj" --source https://api.nuget.org/v3/index.json
    RUN dotnet publish "Domain/Domain.csproj" -c Release -o /app/publish --no-restore
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:27:33