.NET 7 SDK 对容器的内置支持
作者:互联网
大家好,我是等天黑。
.NET 又双叒叕出新功能了, 就在前几天,.NET 团队发布博客,宣称在 .NET SDK 中内置了对 .NET 应用容器化的支持。
小试牛刀
在正式介绍它之前,先通过一个简单的例子,看下它是如何使用的。
# 创建一个新项目, 然后进入到文件夹
dotnet new mvc -n my-awesome-container-app
cd my-awesome-container-app
# 添加下面的程序包
#(目前需要手动引入, 后续会直接集成到 .NET SDK)
dotnet add package Microsoft.NET.Build.Containers
# 发布项目
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer
# 在容器中运行应用
docker run -it --rm -p 5010:80 my-awesome-container-app:1.0.0
然后访问 http://localhost:5010, 就已经可以看到这个测试的 .NET MVC 应用了。
注意,这里需要安装 .NET 7 preview 7 或以上版本,并且本机安装并运行了 Docker。
容器化 .NET 应用是不是变得更加简单方便了。
内置容器化支持
可能你已经有了疑问, 这是什么魔法?我们熟悉的 Dockerfile 去哪了? 基础镜像是怎么定义的?镜像标签是什么?
是的,之前我们更熟悉使用 Dockerfile 的形式构建镜像。而现在,可以在 .NET 项目中,配置 MSBuild 属性来做同样的事情,指定基础镜像,标签等等。
要对 .NET 应用进行容器化,只需要在 project.csproj 中配置属性即可,如下
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>my_awesome_container_app</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PublishProfile>DefaultContainer</PublishProfile>
<ContainerImageName>my-super-awesome-app</ContainerImageName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Build.Containers" Version="0.1.8" />
</ItemGroup>
</Project>
下面是一些常见的自定义参数介绍
基础镜像
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:6.0</ContainerBaseImage>
镜像库
默认情况下,会推送到本地的 Docker Daemon,当然也支持推送到远程的镜像库。
<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>
镜像标签
标签可以给应用生成不同的版本,默认情况是读取项目的 Version 属性,你也可以指定 ContainerImageTag 属性,如下
<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>
多个标签用分号隔开
<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>
目前来说,项目还是在初期阶段,不过已经看到了 .NET 团队在这方面的努力,对于其他的一些容器化功能,相信会很快在未来的版本中添加。
更多详细的内容,可以参考下面的文档:
https://github.com/dotnet/sdk-container-builds/blob/main/docs/ContainerCustomization.md
总结
上面的容器化功能,主要是由 sdk-container-builds 这个库实现的。工作原理并不复杂,代码也不多,里面使用到了 .NET 7 新的 Tar API 处理文件,并构建了标准的 OCI 镜像文件,然后通过 Docker Registry HTTP API 和 Docker Registry 进行交互以及上传镜像。
希望本文对您有用 !
Reference
https://github.com/dotnet/sdk-container-builds
https://docs.docker.com/registry/spec/api/
https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk
标签:容器,内置,container,dotnet,镜像,NET,com,SDK 来源: https://www.cnblogs.com/myshowtime/p/16645615.html