共用方式為


使用 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 中,然後可以使用適當的工具來載入。

  • Dockerdocker load -i ./images/container-image.tar.gz
  • Podmanpodman 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

後續步驟