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

.NET 6下用Docker Buildkit缓存NuGet包报NETSDK1064错误如何解决?

错误原因

NETSDK1064报错的核心逻辑是:--mount=type=cache挂载的缓存卷仅对当前执行的RUN指令生效,dotnet restore运行结束后缓存就会被卸载,后续执行dotnet build --no-restore时无法访问缓存路径下的NuGet包,因此提示依赖缺失。.NET 5版本可正常运行是旧版SDK的依赖解析逻辑兼容了该场景,不属于通用设计。

解决方案

按推荐优先级排序如下:

方案1:给所有依赖NuGet包的指令添加相同缓存挂载(最推荐)

修改Dockerfile,给build、test、publish所有涉及依赖读取的RUN指令,都加上和restore完全一致的缓存挂载参数即可,修改后示例如下:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS sdk
WORKDIR /src
COPY "ApiTemplate.sln" "."
COPY "Source/ApiTemplate/*.csproj" "Source/ApiTemplate/"
# 还原阶段挂载NuGet缓存
RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    dotnet restore
COPY . .
# 构建阶段挂载相同缓存
RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    dotnet build --configuration Release --no-restore
# 测试阶段挂载相同缓存
RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    dotnet test --configuration Release --no-build
# 发布阶段挂载相同缓存
RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    dotnet publish "Source/ApiTemplate/ApiTemplate.csproj" --configuration Release --no-build --output /app

多架构构建场景下,不同架构需要配置不同的缓存ID,比如amd64用id=nuget-amd64,arm64用id=nuget-arm64,避免不同架构的NuGet包结构冲突

方案2:还原时指定包存储到项目工作目录

给dotnet restore添加--packages ./packages参数,将还原的包直接写入容器内的项目工作目录,后续步骤可直接读取依赖,无需额外配置缓存挂载,缺点是会增加构建层体积,缓存提速效果会下降:

RUN dotnet restore --packages ./packages

方案3:移除--no-restore参数(兜底方案)

直接删除build指令中的--no-restore参数,让构建阶段自动执行二次还原,该方案会损失缓存带来的构建提速效果,仅适合临时验证问题使用。

注意

如果修改后依旧报错,可执行docker builder prune清理旧的损坏构建缓存后重新构建。


内容的提问来源于stack exchange,提问作者Muhammad Rehan Saeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:24:05