含多类库依赖的.NET 5项目构建Docker镜像失败,如何部署到远程Debian
问题根因
你使用的官方mcr.microsoft.com/dotnet/sdk:5.0基础镜像默认未预装Node.js运行环境,而你的WebUI项目引入了TypeScript编译任务,该任务依赖node可执行文件执行,因此构建时触发找不到node的报错。你之前调整Dockerfile路径的操作无法解决问题,该报错和文件路径无关。
最简解决方案(二选一即可)
方案1:修改Dockerfile在构建阶段安装Node.js(推荐,不改动项目代码)
仅需要在Dockerfile的build阶段增加Node.js安装步骤即可,修改后的完整Dockerfile如下:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build # 新增内容开始:安装Node.js 16.x 满足TypeScript编译依赖 RUN apt-get update && apt-get install -y curl RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - RUN apt-get install -y nodejs # 新增内容结束 WORKDIR /src COPY ["WebUI/WebUI.csproj", "WebUI/"] COPY ["Shared/Dll1/Dll1.csproj", "Shared/Dll1/"] COPY ["Shared/Dll2/Dll2.csproj", "Shared/Dll2/"] COPY ["Shared/Dll3/Dll3.csproj", "Shared/Dll3/"] COPY ["Dll4/Dll4.csproj", "Dll4/"] COPY ["Dll5/Dll5.csproj", "Dll5/"] RUN dotnet restore "WebUI/WebUI.csproj" COPY . . RUN dotnet publish "WebUI/WebUI.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=build /app/publish . ENTRYPOINT ["dotnet", "WebUI.dll"]
修改完成后在解决方案根目录执行原构建命令即可正常完成镜像构建:docker build -t counter-image -f Dockerfile .
方案2:禁用项目的TypeScript构建任务(适合本地已提前编译好TS的场景)
打开WebUI项目的.csproj文件,在<PropertyGroup>节点下新增如下配置即可禁用MSBuild的TypeScript编译步骤,不需要修改Dockerfile就能正常构建:
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
该方案需要你保证本地开发时已经把所有TypeScript代码编译为JS文件并随项目一起提交。
其他说明
报错中出现的CS0114警告仅为C#编码规范提示,不影响项目构建,不需要处理也可正常运行。
内容的提问来源于stack exchange,提问作者18666
相关产品推荐
相关产品推荐

