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

.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 &amp;&amp; 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:50:34