.NET6多项目Docker构建中dotnet restore耗时过长问题求助
.NET 6 Docker构建中dotnet restore耗时过长且失败的解决方案
项目结构
root: DockerFile .dockerignore Project.sln -src --Project1 ---*.csproj --Project2 ---*.csproj --Project3 ---*.csproj --Project4 //library --Project3 //library
Dockerfile内容
#Build Stage FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build WORKDIR /source COPY . . RUN dotnet restore "./src/pp.WebApi/pp.WebApi.csproj" --disable-parallel RUN dotnet publish "./src/pp.WebApi/pp.WebApi.csproj" --runtime win-x64 -c release -o --no-restore /app #Serve Stage FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal WORKDIR /app COPY --from=build /app ./ EXPOSE 5000 ENTRYPOINT ["dotnet", "pp.WebApi.dll"]
.dockerignore内容
**/.dockerignore **/.env **/.git **/.gitignore **/.vs **/.vscode **/*.*proj.user **/azds.yaml **/charts **/bin **/obj **/Dockerfile **/Dockerfile.develop **/docker-compose.yml **/docker-compose.*.yml **/*.dbmdl **/*.jfm **/secrets.dev.yaml **/values.dev.yaml **/.toolstarget ### Csharp ### ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/
构建命令
docker build --rm -t rr:latest . --memory="16g" --no-cache
问题现象
dotnet restore命令耗时约40分钟,期间出现包下载失败提示
解决方案
1. 优化Dockerfile的COPY逻辑,利用缓存减少重复restore
当前Dockerfile先拷贝整个项目目录再执行restore,任何文件变动都会触发全量重新restore。修改为仅先拷贝项目依赖文件,再执行restore,最后拷贝剩余代码:
#Build Stage FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build WORKDIR /source # 仅拷贝所有csproj文件,触发缓存命中 COPY src/Project1/*.csproj src/Project1/ COPY src/Project2/*.csproj src/Project2/ COPY src/Project3/*.csproj src/Project3/ COPY src/Project4/*.csproj src/Project4/ COPY src/pp.WebApi/*.csproj src/pp.WebApi/ # 移除--disable-parallel,启用并行下载加速 RUN dotnet restore "./src/pp.WebApi/pp.WebApi.csproj" # 拷贝剩余项目文件 COPY . . # 修正publish参数顺序(原命令中-o与--no-restore位置错误),并匹配基础镜像的runtime RUN dotnet publish "./src/pp.WebApi/pp.WebApi.csproj" --runtime linux-x64 -c release -o /app --no-restore #Serve Stage FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal WORKDIR /app COPY --from=build /app ./ EXPOSE 5000 ENTRYPOINT ["dotnet", "pp.WebApi.dll"]
2. 修正Runtime与基础镜像不匹配问题
原Dockerfile使用--runtime win-x64,但基础镜像mcr.microsoft.com/dotnet/aspnet:6.0-focal是Linux(Ubuntu Focal)镜像,跨平台构建会大幅增加开销且容易出错。改为linux-x64匹配基础镜像;若需Windows容器,需更换基础镜像为mcr.microsoft.com/dotnet/sdk:6.0-windowsservercore-ltsc2022。
3. 切换国内NuGet源加速下载
若因网络问题导致下载缓慢,restore时指定国内源(如阿里云):
RUN dotnet restore "./src/pp.WebApi/pp.WebApi.csproj" --source https://mirrors.aliyun.com/nuget/v3/index.json
或在项目根目录添加NuGet.Config文件,确保该文件被拷贝到容器中:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="aliyun" value="https://mirrors.aliyun.com/nuget/v3/index.json" /> </packageSources> </configuration>
4. 检查容器网络连通性
若上述方法无效,可在构建阶段添加网络测试命令,确认容器能否访问NuGet源:
RUN curl -I https://api.nuget.org/v3/index.json
若返回失败,需配置Docker代理或检查主机网络设置。
内容的提问来源于stack exchange,提问作者Mateusz Duda
相关产品推荐
相关产品推荐

