Azure DevOps中使用Docker构建.NET Core项目遇到的SDK版本兼容及多DLL启动配置问题
让我一步步帮你解决这两个问题:
完全不需要!你的核心问题出在基础镜像版本不匹配上。你当前用的microsoft/aspnetcore-build:2.0镜像自带的是.NET Core 2.0 SDK,根本不支持3.1版本的项目编译。
你只需要替换成对应.NET Core 3.1版本的官方构建镜像即可,推荐用微软维护的mcr.microsoft.com/dotnet/sdk:3.1作为构建阶段的基础镜像(这个镜像自带完整的3.1 SDK),运行时阶段可以用更轻量的mcr.microsoft.com/dotnet/aspnet:3.1镜像(只包含运行所需的环境,能减小最终镜像体积)。整个构建流程都在自带正确SDK的镜像内完成,不需要额外在YAML里加安装SDK的任务。
给你一个适配的多阶段构建Dockerfile示例:
# 构建阶段:包含完整SDK,用于编译项目 FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build WORKDIR /src # 先复制解决方案和所有项目文件,利用Docker缓存优化构建速度 COPY YourSolution.sln . COPY ProjectA/ProjectA.csproj ProjectA/ COPY ProjectB/ProjectB.csproj ProjectB/ COPY YourMainProject/YourMainProject.csproj YourMainProject/ # 把你的4个csproj都按这种格式复制进来 # 执行还原命令 RUN dotnet restore # 复制所有代码文件并构建 COPY . . WORKDIR /src/YourMainProject RUN dotnet build -c Release -o /app/build # 发布阶段:生成可部署的输出文件 FROM build AS publish RUN dotnet publish -c Release -o /app/publish # 最终运行镜像:只包含运行时环境,体积更小 FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS final WORKDIR /app # 复制发布阶段的所有输出(包括主DLL和依赖DLL) COPY --from=publish /app/publish . # 指定主项目的DLL作为入口 ENTRYPOINT ["dotnet", "YourMainProject.dll"]
你不用特意处理多DLL的加载!dotnet publish命令会自动把主项目和所有依赖项目的输出文件(包括依赖DLL、配置文件、资源文件等)打包到/app/publish目录下。只要你用上面的Dockerfile,通过COPY --from=publish /app/publish .把整个发布目录的内容复制到最终镜像里,.NET运行时会自动找到并加载所有依赖的DLL。
你只需要确保ENTRYPOINT里指定的是包含Program.cs的主项目DLL(也就是你在Visual Studio里设置为启动项目的那个项目生成的DLL),其他依赖DLL会被自动加载,不需要额外配置。
另外补充一点:微软已经弃用了microsoft/aspnetcore-build这类旧镜像,现在优先使用mcr.microsoft.com/dotnet/sdk和mcr.microsoft.com/dotnet/aspnet系列镜像,这些镜像版本对应更清晰,维护也更及时。
内容的提问来源于stack exchange,提问作者Asterix

