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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:19:54