Asp.Net Core WebAPI自包含发布到Docker的独立性及单目录部署问题
问题解答
1. 两个发布目录无差异的原因
你执行的第二条命令仅指定了运行时标识符-r linux-x64,未添加--no-self-contained参数:在.NET Core 3.0及以上版本中,指定-r参数时默认会启用自包含发布模式,所以两次命令实际生成的都是自包含包,自然没有明显差异。
如果要生成依赖系统dotnet运行时的框架依赖包,正确命令应为:
dotnet publish WebApi.csproj -c Release -o linux-dotnet --no-self-contained -r linux-x64
此时生成的linux-dotnet目录会比自包含目录小很多,仅包含应用本身的代码和第三方依赖,没有.NET运行时相关文件。
2. 单目录打包运行的实现方式
你需要的就是自包含发布模式,该模式会把.NET运行时、应用代码、所有依赖全部打包到同一个输出目录,不需要目标系统预先安装.NET运行时,完全可以在Docker容器中正常运行:
- 发布时使用
--self-contained -r linux-x64参数即可 - Dockerfile的ENTRYPOINT不需要调用系统dotnet命令,直接执行输出目录中生成的同名可执行文件即可:
按该方式构建的镜像内不会存在系统级的dotnet相关文件,符合你的需求。ENTRYPOINT ["./MyProject.WebApi"]
如果需要进一步缩小镜像体积,可以在发布命令中添加裁剪参数,删除未用到的框架代码:
dotnet publish WebApi.csproj -c Release -o linux-self-contained --self-contained -r linux-x64 /p:PublishTrimmed=true
3. Selenium部署方案说明
你后续找到的将Selenium部署在独立容器的方案确实是更优选择:
- 避免了在应用镜像中打包浏览器、驱动等大型依赖,大幅减小应用镜像体积
- 两个服务独立升级、维护,耦合度更低
- 仅需要修改WebAPI中Selenium的连接地址为独立容器的访问地址即可,改造成本极低
内容的提问来源于stack exchange,提问作者MicMit
相关产品推荐
相关产品推荐

