.NET 6.0容器发布报错MSB4018:文件被占用无法访问
.NET 6.0容器中发布React+ASP.NET Core应用时web.config被占用的构建失败问题
问题描述
在Microsoft .NET 6.0 SDK容器中发布React-JS+ASP.NET Core应用时构建失败,报错显示System.IO.IOException: The process cannot access the file '/app/My-App/web.config' because it is being used by another process,错误发生在前端构建完成后或接近完成阶段。此前使用mcr.microsoft.com/dotnet/core/sdk:2.2镜像构建正常,迁移到.NET 6.0后出现该问题。
完整错误日志
#25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: The "TransformWebConfig" task failed unexpectedly. [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: System.IO.IOException: The process cannot access the file '/app/My-App/web.config' because it is being used by another process. [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at Microsoft.Win32.SafeHandles.SafeFileHandle.Init(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at System.IO.FileSystem.CopyFile(String sourceFullPath, String destFullPath, Boolean overwrite) [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite) [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at Microsoft.NET.Sdk.Publish.Tasks.TransformWebConfig.Execute() [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [/app/My-App/My-App.csproj] #25 253.0 /usr/share/dotnet/sdk/6.0.401/Sdks/Microsoft.NET.Sdk.Publish/targets/TransformTargets/Microsoft.NET.Sdk.Publish.TransformFiles.targets(50,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) [/app/My-App/My-App.csproj] ------ executor failed running [/bin/sh -c dotnet publish "My-App/My-App.csproj" -c Release -o /app/My-App]: exit code: 1
相关Dockerfile内容
# ========= Build ASP.NET Core ========= FROM mcr.microsoft.com/dotnet/sdk:6.0 AS dotnet_backend_build RUN apt update && apt upgrade -y RUN apt install -y curl wget make g++ # ========== Install Node ========== RUN curl --silent --location https://deb.nodesource.com/setup_lts.x | bash - RUN apt install -yq --no-install-recommends build-essential nodejs # Node needs more memory during buildtime than default (=512) ARG NODE_OPTIONS="--max-old-space-size=4096" # ========= Installed Node ========= WORKDIR /app COPY . . RUN dotnet restore "./My-App/My-App.csproj" RUN dotnet publish "My-App.csproj" -c Release -o /My-App/My-App # ========= Built ASP.NET Core =========
已尝试的解决方法
- 本地Windows环境用MSBuild编译正常
- 添加
RUN dotnet build-server shutdown命令 - 修改csproj分层
- 传递MSBuild参数
- 开启详细日志但被Docker截断
可能的解决方案
1. 调整web.config转换配置
在项目的.csproj文件中禁用自动web.config转换,避免和前端构建进程冲突:
<PropertyGroup> <TransformWebConfigEnabled>false</TransformWebConfigEnabled> </PropertyGroup>
若需保留转换功能,可手动执行转换步骤,确保在前端构建完成后再处理web.config。
2. 分离前端与后端构建阶段
采用Docker多阶段构建,将前端构建单独放在Node镜像中完成,再将产物复制到.NET构建阶段,避免进程间文件竞争:
# 前端构建阶段 FROM node:lts AS frontend_build WORKDIR /app/frontend COPY ./My-App/ClientApp . RUN npm install RUN npm run build # .NET后端构建阶段 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS dotnet_backend_build RUN apt update && apt upgrade -y WORKDIR /app COPY . . # 复制前端构建产物 COPY --from=frontend_build /app/frontend/build ./My-App/ClientApp/build RUN dotnet restore "./My-App/My-App.csproj" RUN dotnet publish "My-App/My-App.csproj" -c Release -o /app/publish
3. 修改发布输出路径
当前Dockerfile中dotnet publish的输出路径与项目目录重叠,可能导致文件占用。修改为独立目录:
RUN dotnet publish "My-App/My-App.csproj" -c Release -o /app/publish
4. 清理前端构建进程
检查.csproj中是否有自动触发前端构建的配置,确保前端构建完成后相关Node进程已退出。可在前端构建命令后添加进程清理:
<Target Name="PublishFrontend" BeforeTargets="Publish"> <Exec Command="npm run build && pkill -f node" WorkingDirectory="$(ProjectDir)/ClientApp" /> </Target>
注意:该操作仅适用于Docker构建环境,避免影响本地开发。
5. 升级.NET SDK版本
当前使用的6.0.401版本存在已知文件占用问题,尝试升级到.NET 6最新补丁版本:
FROM mcr.microsoft.com/dotnet/sdk:6.0.425 AS dotnet_backend_build
内容的提问来源于stack exchange,提问作者Energeneer
相关产品推荐
相关产品推荐

