Ubuntu下Docker无法启动Blazor项目问题求助
解决Blazor Docker容器启动报错:找不到SampleBlazor.dll或无.NET SDK
问题场景
在Ubuntu 24.04上用Rider 2025.1.3创建.NET 9 Blazor Server项目(默认带Counter/Weather页面,本地运行正常),使用Rider自动生成的Dockerfile构建镜像后,容器启动失败,报错:
The command could not be loaded, possibly because:
- You intended to execute a .NET application:
The application 'SampleBlazor.dll' does not exist.- You intended to execute a .NET SDK command:
No .NET SDKs were found.
已禁用Rider的fast build功能,自动生成的Dockerfile如下:
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER $APP_UID WORKDIR /app EXPOSE 8080 EXPOSE 8081 FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["SampleBlazor/SampleBlazor.csproj", "SampleBlazor/"] RUN dotnet restore "SampleBlazor/SampleBlazor.csproj" COPY . . WORKDIR "/src/SampleBlazor" RUN dotnet build "./SampleBlazor.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./SampleBlazor.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "SampleBlazor.dll"]
解决步骤
1. 确认发布输出的程序集名称
本地执行发布命令,查看输出目录的文件:
dotnet publish -c Release
进入bin/Release/net9.0/publish目录,检查是否存在SampleBlazor.dll。若文件名有差异(比如带后缀或命名变化),同步修改Dockerfile中ENTRYPOINT的文件名。
2. 检查Docker构建上下文
执行docker build命令时,确保当前工作目录是项目根目录(即包含SampleBlazor子文件夹的目录),否则COPY步骤会找不到项目文件,导致发布不完整。
3. 排查权限问题
暂时注释掉USER $APP_UID行,测试是否因权限不足无法读取文件:
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base # USER $APP_UID WORKDIR /app EXPOSE 8080 EXPOSE 8081
若启动正常,再重新配置用户权限。
4. 验证发布阶段输出
在publish阶段添加查看命令,确认文件是否生成:
FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./SampleBlazor.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false # 验证发布文件 RUN ls -la /app/publish
构建时查看输出,确认SampleBlazor.dll存在于目标目录。
修正后的Dockerfile示例
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base WORKDIR /app EXPOSE 8080 EXPOSE 8081 FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["SampleBlazor/SampleBlazor.csproj", "SampleBlazor/"] RUN dotnet restore "SampleBlazor/SampleBlazor.csproj" COPY . . WORKDIR "/src/SampleBlazor" RUN dotnet build "./SampleBlazor.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./SampleBlazor.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "SampleBlazor.dll"]
内容的提问来源于stack exchange,提问作者StefanG
相关产品推荐
相关产品推荐

