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
相关产品推荐
相关产品推荐

