.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 APIDocker 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章