Docker部署ABP项目时dotnet publish未处理bundleconfig.json问题
问题原因
- 项目引用的
BuildBundlerMinifier组件默认执行钩子仅挂载在Build事件上,dotnet publish执行时默认不会主动触发静态资源压缩流程。 - 原有Dockerfile构建流程存在路径断层:执行
dotnet build时是在源码目录/src/XxXxX.Web.Mvc下运行,能正常读取bundleconfig.json和wwwroot下的原始css、js文件,所以压缩流程正常,生成的min文件存放在源码目录的wwwroot对应路径下;但build的输出指定到了/app/build目录,这些生成的静态压缩文件不会被自动拷贝到build输出目录。后续执行dotnet publish时,运行上下文中的静态资源路径和配置路径匹配异常,Bundler读取不到待压缩的源文件,因此只打印开始、结束日志,没有实际生成压缩产物,最终发布的应用缺失所有静态资源,页面就会出现无样式、无交互的问题。
修复方法
推荐直接调整Dockerfile构建流程,去掉冗余的单独build步骤,从源码目录直接执行publish,确保压缩流程能读取到所有依赖文件,修改后的完整Dockerfile如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 ENV ASPNETCORE_ENVIRONMENT Production FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["XxXxX.Web.Mvc/XxXxX.Web.Mvc.csproj", "src/XxXxX.Web.Mvc/"] COPY ["XxXxX.Web.Core/XxXxX.Web.Core.csproj", "src/XxXxX.Web.Core/"] COPY ["XxXxX.Application/XxXxX.Application.csproj", "src/XxXxX.Application/"] COPY ["XxXxX.Core/XxXxX.Core.csproj", "src/XxXxX.Core/"] COPY ["XxXxX.EntityFrameworkCore/XxXxX.EntityFrameworkCore.csproj", "src/XxXxX.EntityFrameworkCore/"] RUN dotnet restore "src/XxXxX.Web.Mvc/XxXxX.Web.Mvc.csproj" COPY . . WORKDIR "/src/XxXxX.Web.Mvc" RUN dotnet publish "XxXxX.Web.Mvc.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "XxXxX.Web.Mvc.dll"]
如果需要保留原有Dockerfile的多阶段构建结构,也可以在MVC项目的.csproj文件中添加配置,强制publish阶段触发压缩逻辑,在<PropertyGroup>节点中加入以下配置即可:
<BundlerOnPublish>true</BundlerOnPublish>
注意:该配置生效的前提是publish执行时,命令工作目录下存在完整的wwwroot静态资源和bundleconfig.json文件,否则依然会出现Bundler空跑的问题。
内容的提问来源于stack exchange,提问作者Moayad Rayyan
相关产品推荐
相关产品推荐

