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

Docker构建ASP.NET Core+React项目时npm build资源锁定问题求助

Docker多阶段构建React SPA时EBUSY资源锁定问题的解决

问题详情

我有一个ASP.NET Core 3.1项目,托管基于create-react-app构建的React单页应用(SPA)。使用Visual Studio 2022执行Docker多阶段构建发布时,10次中有9次会在构建优化JS资源时失败,错误提示:

EBUSY: resource busy or locked, mkdir 'C:\app{ProjectName}\wwwroot\ClientApp\build\static'

该问题并非100%复现,推测问题不在Dockerfile本身。尝试过停止/删除容器、删除所有Docker镜像,但无法可靠解决,偶尔构建成功的原因也不明确。

Dockerfile摘要:

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
### 内容已简化,复制和还原操作在此构建镜像中完成 ###

FROM build AS publish
WORKDIR /app
### 失败发生在这一步 ###
RUN dotnet publish "{ProjectName}/{ProjectName}.csproj" -c Release -o /app/publish

dotnet publish会自动执行npm install和react-scripts build,失败发生在react-scripts build阶段(创建build\static文件夹时)。本地或主机VM上构建从未出错,仅Docker环境下出现问题。

环境信息:Windows 10,Hyper-V模式的Docker Desktop v4.10.1

注:已搜索相关问题,多数结果与卷挂载有关,但本次未指定任何卷挂载,使用默认设置。

可行解决方案

1. 拆分React构建到独立Docker阶段

把React构建从dotnet publish流程中剥离,单独使用Node镜像完成构建,再将产物复制到.NET项目中,避免.NET SDK镜像内的文件系统冲突:

# 第一阶段:构建React应用
FROM node:16-alpine AS react-build
WORKDIR /clientapp
COPY {ProjectName}/wwwroot/ClientApp/package*.json ./
RUN npm ci --no-audit
COPY {ProjectName}/wwwroot/ClientApp/ ./
RUN npm run build

# 第二阶段:.NET项目构建
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /app
COPY {ProjectName}/ ./
# 复制React构建产物到项目对应目录
COPY --from=react-build /clientapp/build ./wwwroot/ClientApp/build
RUN dotnet restore "{ProjectName}.csproj"
RUN dotnet build "{ProjectName}.csproj" -c Release -o /app/build

# 第三阶段:发布.NET应用
FROM build AS publish
RUN dotnet publish "{ProjectName}.csproj" -c Release -o /app/publish

2. 禁用Docker Desktop的WSL集成(Hyper-V模式下)

打开Docker Desktop设置,进入Resources > WSL Integration,关闭所有WSL发行版的集成选项,重启Docker Desktop。部分场景下,WSL与Hyper-V的文件系统交互会引发资源锁定。

3. 修改React构建输出目录

在ClientApp/package.json中修改build脚本,指定非默认输出目录:

"scripts": {
  "build": "react-scripts build && ren build build-static"
}

同时在ASP.NET Core的Startup.cs中更新SPA静态文件的指向路径,确保应用能正确加载构建产物。

4. 清理Docker构建缓存

执行命令手动清理所有构建缓存,避免陈旧缓存文件导致的资源冲突:

docker builder prune -a -f

内容的提问来源于stack exchange,提问作者broccoli_rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:45:39