使用 dotnet publish 將 .NET 應用程式容器化
容器有許多功能和優點,例如不可變的基礎結構、提供可攜式架構,以及啟用延展性。 此映像可用來為本機開發環境、私人雲端或公用雲端建立容器。 在本教學課程中,您將瞭解如何使用 dotnet publish 命令來容器化 .NET 應用程式,而不需使用 Dockerfile。 此外,您會探索如何設定 容器映像 和執行,以及如何清除資源。
提示
如果您想要使用 Dockerfile 容器化 .NET 應用程式,請參閱 教學課程:將 .NET 應用程式容器化。
先決條件
安裝下列必要條件:
-
.NET 8+ SDK
如果您已安裝 .NET,請使用dotnet --info
命令來判斷您使用的 SDK。
如果您打算在本機執行容器,您需要開放容器計劃 (OCI)相容的容器運行時間,例如:
- Docker Desktop:最常見的容器運行時間。
- Podman:Docker 的開放原始碼無精靈替代方案。
重要
.NET SDK 會建立沒有 Docker 的容器映像。 只有在您想要在本機執行映射時,才需要 Docker 或 Podman。 根據預設,當您 將 .NET 應用程式發佈 為容器映像檔時,它會推送至本機容器執行環境。 或者,您可以將 映射儲存為 tarball,或直接將它推送至 容器登錄,而不需使用任何容器運行時間。
除了這些必要條件之外,建議您熟悉 .NET 中的 Worker Services,因為範例專案是工作服務。
建立 .NET 應用程式
您需要 .NET 應用程式才能容器化,因此從範本建立新的應用程式開始。 開啟您的終端機,建立工作資料夾 (sample-directory),如果您尚未這麼做,請變更目錄,以便您位於其中。 在工作資料夾中,執行下列命令,在名為 Worker的子目錄中建立新專案:
dotnet new worker -o Worker -n DotNet.ContainerImage
您的資料夾樹狀結構看起來類似下列目錄:
📁 sample-directory
└──📂 Worker
├──appsettings.Development.json
├──appsettings.json
├──DotNet.ContainerImage.csproj
├──Program.cs
├──Worker.cs
├──📂 Properties
│ └─── launchSettings.json
└──📂 obj
├── DotNet.ContainerImage.csproj.nuget.dgspec.json
├── DotNet.ContainerImage.csproj.nuget.g.props
├── DotNet.ContainerImage.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
dotnet new
命令會建立名為 Worker 的新資料夾,併產生一個背景工作服務,執行時,每秒會記錄一則訊息。 從終端機會話變更目錄,然後進入 [工作員] 資料夾。 使用 dotnet run
命令來啟動應用程式。
dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
工作者範本會不斷地迴圈。 使用 cancel 命令 Ctrl+C 來停止它。
設定容器映像名稱
將應用程式發佈為容器時,有各種可用的組態選項。 根據預設,容器映像名稱是專案的 AssemblyName
。 如果該名稱無效為容器映射名稱,您可以藉由指定 ContainerRepository
來覆寫它,如下列項目檔所示:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
<ContainerRepository>dotnet-worker-image</ContainerRepository>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
</ItemGroup>
</Project>
如需進一步參考,請參閱 ContainerRepository
。
發佈 .NET 應用程式
若要將 .NET 應用程式發佈為容器,請使用下列 dotnet publish 命令:
dotnet publish --os linux --arch x64 /t:PublishContainer
上述 .NET CLI 命令會將應用程式發佈為容器:
- 以 Linux 作為 OS 為目標(
--os linux
)。 - 指定 x64 架構 (
--arch x64
)。
重要
若要在本機發佈容器,您必須執行作用中的 OCI 相容精靈。 如果在您嘗試將應用程式發佈為容器時,它未在運行,您將會遇到類似下列的錯誤:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
dotnet publish
命令會產生與範例輸出相似的結果:
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
此命令會將背景工作應用程式編譯至 發佈 資料夾,並預設將容器映像推送至本機 Docker 精靈。 如果您使用Podman,則為別名
將 .NET 應用程式發佈到 tar 壓縮檔
tar 檔案(或稱 tarball)是用來存放其他檔案的檔案。 其結尾通常是 *.tar.gz 複合檔案副檔名,以表示它是壓縮檔案。 這些文件類型可用來發佈軟體或建立備份。 在此情況下,所建立的 tarball 會用來分發容器映像。
若要將 .NET 應用程式發佈為容器至 tarball,請使用下列命令:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
上述命令會將應用程式作為容器發佈,並打包成 tarball 文件。
- 以 Linux 作為 OS 為目標(
--os linux
)。 - 指定 x64 架構 (
--arch x64
)。 - 將
ContainerArchiveOutputPath
屬性設定為./images/container-image.tar.gz
。
此命令不需要執行中符合 OCI 規範的精靈。 如需詳細資訊,請參閱 ContainerArchiveOutputPath
。
載入壓縮檔案
匯出至 tarball 的常見使用案例適用於以安全性為主的組織。 他們會建立容器,將它們匯出為 tar 檔案,然後對這些 tar 檔案執行安全性掃描工具。 這種方法可簡化合規性,因為它可避免掃描即時系統的複雜性。
整個容器都包含在 tarball 中,然後可以使用適當的工具來載入。
-
Docker:
docker load -i ./images/container-image.tar.gz
-
Podman:
podman load -i ./images/container-image.tar.gz
將 .NET 應用程式發佈至容器登錄
容器登錄是儲存和管理容器映像的服務。 它們可用來儲存容器映像,並將容器映像分散到多個環境。 您可以使用下列命令,將 .NET 應用程式作為容器發佈到容器登錄伺服器:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
上述程式碼會將應用程式發佈成容器至容器註冊表。
- 以 Linux 作為 OS 為目標(
--os linux
)。 - 指定 x64 架構 (
--arch x64
)。 - 將
ContainerRegistry
屬性設定為ghcr.io
。
如需詳細資訊,請參閱 ContainerRegistry。
清除資源
在本文中,您已將 .NET 背景工作角色發佈為容器映射。 如果您想要,請刪除此資源。 使用 docker images
命令來查看已安裝的映像清單。
docker images
請考慮下列範例輸出:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
提示
圖像檔可能很大。 一般而言,您會移除您在測試及開發應用程式時建立的暫存容器。 如果您打算根據某個執行時期建置其他映像,通常會保留安裝了此執行時期的基礎映像。
若要刪除映像,請複製映像識別碼並執行 docker image rm
命令:
docker image rm 25aeb97a2e21