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

