.NET 7 SDK 對容器的內建支援

2022-09-01 12:04:43

大家好,我是等天黑。

.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