共用方式為


.NET 8 在容器方面的新功能

本文說明 .NET 8 在容器方面的新功能。

容器映像

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

非根使用者

映像包含一個 non-root 使用者。 此使用者可讓映像具備 non-root 能力。 若要以 non-root 執行,請在 Dockerfile 的結尾處新增下面這行 (或是在 Kubernetes 資訊清單中新增類似指示):

USER app

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

預設連接埠也會從連接埠 80 變更為 8080。 為支援這項變更,我們有新的環境變數 ASPNETCORE_HTTP_PORTS 可供您更輕鬆地變更連接埠。 該變數接受使用連接埠清單,比 ASPNETCORE_URLS 所需的格式更簡單。 如果您使用其中一個變數,將連接埠變更回連接埠 80,您將無法以 non-root 執行。

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

Debian 12

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

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

Chiseled Ubuntu 映像

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

默認不支援全球化的擷取影像。 extra 系統會提供映像,其中包含 icutzdata 套件。

如需全球化和容器的詳細資訊,請參閱 全球化測試應用程式

建立多平台容器映像

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 映像。 此複合建置方式是將多個 MSIL 組件編譯成單一就緒執行 (R2R) 輸出二進位檔。 由於這些元件會內嵌在單一映像中,因此抖動會花費較少的時間,且應用程式的啟動效能會改善。 複合在一般 ASP.NET 映像上的另一大優點是複合映像的磁碟大小較小。

有一個警告要注意。 由於複合組件內嵌在一個組件中,因此它們具有更緊密的版本結合程度。 應用程式無法使用自訂版本的架構或 ASP.NET 二進位檔。

複合映像 適用於 Alpine Linux、Ubuntu(“jammy”) Chiseled,以及存放庫中的 mcr.microsoft.com/dotnet/aspnet 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

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

另請參閱