共用方式為


適用於 .NET 8 的容器新功能

本文說明適用於 .NET 8 的容器新功能。

容器映像

已對 .NET 8 的 .NET 容器映像進行下列變更:

非根使用者

影像包含 non-root 使用者。 此用戶可使影像具備 non-root 能力。 若要以 non-root身分執行,請在 Dockerfile 結尾新增下列程式代碼行(或 Kubernetes 指令清單中的類似指示):

USER app

.NET 8 會為 non-root 使用者新增 UID 的環境變數,也就是 1654。 此環境變數適用於 Kubernetes runAsNonRoot 測試,這需要透過 UID 設定容器使用者,而不是依名稱設定。 此 dockerfile 會顯示範例用法。

默認埠也會從埠 80 變更為 8080。 為了支援這項變更,可以使用新的環境變數 ASPNETCORE_HTTP_PORTS,讓您更輕鬆地變更埠。 變數接受埠清單,比 ASPNETCORE_URLS所需的格式簡單。 如果您使用下列其中一個變數將埠變更回埠 80,則無法以 non-root身分執行。

如需詳細資訊,請參閱 預設 ASP.NET 核心埠從 80 更改為 8080 和 Linux 映像檔中的 新的非根 'app' 使用者

Debian 12

容器映像現在改為使用 Debian 12(Bookworm)。 Debian 是 .NET 容器映射中的預設Linux散發版本。

如需詳細資訊,請參閱 升級至 Debian 12的 Debian 容器映射。

精簡的 Ubuntu 映像檔

Chiseled Ubuntu 映像 適用於 .NET 8。 切碎影像的受攻擊面變小,因為它們非常小,沒有套件管理員或殼層,而且 non-root。 這種類型的映像適用於想要應用裝置樣式運算優點的開發人員。

默認設定下,雕琢的影像並不支援全球化。 提供 extra 圖像,其中包括 icutzdata 套件。

如需全球化和容器的詳細資訊,請參閱 Globalization Test App

建置多平臺容器映像

Docker 支援使用和建置 多平臺映像, 能夠在多個環境中運行。 .NET 8 引進了新的模式,可讓您混合和比對架構與您所建置的 .NET 映射。 例如,如果您使用macOS並想要以 Azure 中的 x64 雲端服務為目標,您可以使用 --platform 參數來建置映像,如下所示:

docker build --pull -t app --platform linux/amd64

.NET SDK 現在支援還原時 $TARGETARCH 值和 -a 自變數。 下列代碼段顯示範例:

RUN dotnet restore -a $TARGETARCH

# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app

如需詳細資訊,請參閱 改善多平臺容器支援 部落格文章。

ASP.NET 複合影像

為了改善容器化效能,新的 ASP.NET Docker 映像中提供了執行階段的複合版。 此複合建置方式是將多個 CIL 元件編譯成單一就緒執行 (R2R) 輸出二進位檔。 因為這些元件內嵌在單一映射中,因此抖動會花費較少的時間,而且應用程式的啟動效能會改善。 與一般 ASP.NET 影像相比,複合影像的另一大優點是其在磁碟上的大小較小。

有一個警告要注意。 由於複合組件將多個組件嵌入在一起,因此它們的版本耦合更加緊密。 應用程式無法使用自定義版本的架構或 ASP.NET 二進位檔。

合成映像檔 可用於來自 mcr.microsoft.com/dotnet/aspnet 存放庫的 Alpine Linux、Ubuntu(“jammy”)Chiseled,以及 Mariner Distroless 平臺。 在 ASP.NET Docker 頁面上,標籤會以 -composite 後綴列出

容器發佈

生成圖像預設值

dotnet publish 可以產生容器映像。 默認會產生 non-root 映像,這有助於您的應用程式依預設保持安全。 隨時變更此預設值,方法是設定 ContainerUser 屬性,例如使用 root

預設輸出容器標籤現在 latest。 此預設值符合容器空間中的其他工具,讓容器更容易在內部開發迴圈中使用。

效能和相容性

.NET 8 已改善將容器推送至遠端登錄的效能,特別是 Azure 登錄。 加速來自於單次作業中推送多層,對於不支援原子性上傳的登錄而言,這是一種更可靠的分塊機制。

這些改進也意味著支援更多的註冊表:Harbor、Artifactory、Quay.io 和 Podman。

認證

.NET 8 會在將容器推送至登錄時,新增 OAuth 令牌交換驗證 (Azure 受控識別) 的支援。 此支援表示您現在可以將資料推送到如 Azure Container Registry 等的登錄中,而不會遇到任何驗證錯誤。 下列命令顯示範例發佈流程:

> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer

如需容器化 .NET 應用程式的詳細資訊,請參閱使用 dotnet publish將 .NET 應用程式容器化

發布至 tar.gz 壓縮檔案

從 .NET 8 開始,您可以直接建立容器作為 tar.gz 封存。 當您的工作流程不夠簡單,需要您在推送影像之前先對影像執行掃描工具時,這項功能會非常有用。 建立封存之後,您就可以將它移動、掃描或載入本機 Docker 工具鏈。

若要發佈至封存,請將 ContainerArchiveOutputPath 屬性新增至您的 dotnet publish 命令,例如:

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

您可以指定資料夾名稱或具有特定檔案名的路徑。

另請參閱