Asp.Net Core WebAPI [dotnet publish --self-contained -r linux-64] 放入Docker容器后是不是真的自包含

Posted

技术标签:

【中文标题】Asp.Net Core WebAPI [dotnet publish --self-contained -r linux-64] 放入Docker容器后是不是真的自包含【英文标题】:Asp.Net Core WebAPI [dotnet publish --self-contained -r linux-64] is it really self-contained after putting into Docker containerAsp.Net Core WebAPI [dotnet publish --self-contained -r linux-64] 放入Docker容器后是否真的自包含 【发布时间】:2022-01-09 15:11:29 【问题描述】:

如果比较 linux-self-containedlinux-dotnet 文件夹,我在这 2 次发布运行后没有发现任何差异。

dotnet publish WebApi.csproj -c Release -o linux-self-contained --self-contained -r linux-x64
dotnet publish WebApi.csproj -c Release -o linux-dotnet -r linux-x64

是否有可能实现 dotnet(Linux 可执行文件)和任何其他先决条件将进入单个目录而不是 /usr/bin 的发布模式 它可以在 Docker 容器中工作吗?

ENTRYPOINT ["dotnet", "MyProject.WebApi.dll"]

目前如果浏览docker容器的内容

root@6e813cdc578d:/# find . -name dotnet
./usr/share/dotnet
./usr/share/dotnet/dotnet
./usr/bin/dotnet

单目录的概念似乎非常适用于--self-contained .Net Core Console App with

ENTRYPOINT ["./MyLittleConsoleProgram"] 

我在生成的 Docker 映像中没有看到任何 dotnet 事件。

基本上,所有这些练习都是为了实现 How to run dotnet core app with Selenium in Docker

第二个答案确实适用于控制台应用程序)

从那时起,事实证明在单独的容器中使用 selenium 是一种更好的方法,它只需要在 WebAPI 中更改一行代码。

【问题讨论】:

两种发布方式是一样的,因为self-contained的默认值为true 【参考方案1】:

这两个命令是等价的。当您在dotnet publish WebApi.csproj -c Release -o linux-dotnet -r linux-x64 中使用-r 开关时,它会隐式启用--self-contained。在 .NET 6 中,此命令将生成一个警告,告诉您应该显式提供 --self-contained--no-self-contained。因此,如果您想提供 RID 并且不想要自包含部署,则应包括 --no-self-contained

【讨论】:

以上是关于Asp.Net Core WebAPI [dotnet publish --self-contained -r linux-64] 放入Docker容器后是不是真的自包含的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.2 WebAPI 405 方法不允许

带你做 WebAPI 迁移 ASP.NET Core 2.0

ASP.NET Core WebApi返回结果统一包装实践

ASP.NET Core - 从 WebApi 提供静态内容 [重复]

ASP.Net Core WebApi几种版本控制对比

获取 ASP .Net Core WebAPI 中的所有身份角色