Neuerungen an Containern in .NET 8
In diesem Artikel werden neue Features für Containern in .NET 8 beschrieben.
Containerimages
Die folgenden Änderungen wurden an .NET-Containerimages für .NET 8 vorgenommen:
- Nicht-Stammbenutzer
- Debian 12
- Gezeißelte Ubuntu-Images
- Erstellen von Containerimages für mehrere Plattformen
- Zusammengesetzte ASP.NET-Images
Nicht-Stammbenutzer
Images umfassen einen non-root
-Benutzer. Dieser Benutzer macht die Images non-root
-fähig. Um sie als non-root
auszuführen, fügen Sie die folgende Zeile am Ende Ihrer Dockerfile (oder eine ähnliche Anweisung in Ihren Kubernetes-Manifesten) hinzu:
USER app
In .NET 8 wird eine Umgebungsvariable für die UID von non-root
-Benutzer*innen hinzugefügt, die „64.198“ ist. Diese Umgebungsvariable ist nützlich für den Kubernetes runAsNonRoot
-Test, der erfordert, dass der Containerbenutzer über die UID und nicht über den Namen festgelegt werden muss. Diese Dockerfile zeigt ein Beispiel für die Verwendung.
Der Standardport wurde außerdem von Port 80
in 8080
geändert. Um diese Änderung zu unterstützen, ist die neue Umgebungsvariable ASPNETCORE_HTTP_PORTS
verfügbar, um den Wechsel von Ports zu erleichtern. Die Variable akzeptiert eine Liste von Ports, was einfacher ist, als das Format, das für ASPNETCORE_URLS
erforderlich ist. Wenn Sie den Port mit einer dieser Variablen wieder auf Port 80
zurückändern, können Sie nicht als non-root
ausführen.
Weitere Informationen finden Sie unter Änderung des Standard-ASP.NET Core-Ports von 80 in 8080 und Neuer Nicht-Root-Benutzer „App“ in Linux-Images.
Debian 12
Die Containerimages verwenden jetzt Debian 12 (Bookworm). Debian ist die Linux-Standarddistribution in den .NET-Containerimages.
Weitere Informationen finden Sie unter Upgrade von Debian-Containerimages auf Debian 12.
Gezeißelte Ubuntu-Images
„Gemeißelte“ (Schlanke) Ubuntu-Images sind für .NET 8 verfügbar. Gemeißelte Images haben eine verringerte Angriffsfläche, da sie extrem klein sind, keinen Paket-Manager und keine Shell besitzen und non-root
sind. Diese Art von Image richtet sich an Entwickler, die den Vorteil des Computings im Appliance-Stil wünschen.
Chiseled-Images unterstützen die Globalisierung standardmäßig nicht. extra
-Images werden bereitgestellt. Sie enthalten icu
- und tzdata
-Pakete.
Weitere Informationen zu Globalisierung und Containern finden Sie unter Test-App für die Globalisierung.
Erstellen von Containerimages für mehrere Plattformen
Docker unterstützt die Verwendung und Erstellung von Images für mehrere Plattformen, die in mehreren Umgebungen funktionieren. .NET 8 führt ein neues Muster ein, mit dem Sie Architekturen mit den von Ihnen erstellten .NET-Images kombinieren und abgleichen können. Wenn Sie beispielsweise macOS verwenden und einen x64-Clouddienst in Azure als Ziel verwenden möchten, können Sie das Image wie folgt mit der Option --platform
erstellen:
docker build --pull -t app --platform linux/amd64
Das .NET SDK unterstützt jetzt $TARGETARCH
-Werte und das -a
-Argument bei der Wiederherstellung. Der folgende Codeausschnitt zeigt ein Beispiel:
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
Weitere Informationen finden Sie im Blogbeitrag ///Verbesserung der Unterstützung von Containern für mehrere Plattformen.
Zusammengesetzte ASP.NET-Images
Im Rahmen der Bemühungen zur Verbesserung der Containerisierungsleistung sind neue ASP.NET-Docker-Images mit einer zusammengesetzten Version der Runtime verfügbar. Diese Zusammensetzung wird erstellt, indem mehrere MSIL-Assemblys in einer einzelnen R2R-Ausgabebinärdatei (Ready-to-Run) kompiliert werden. Da diese Assemblys in ein einzelnes Image eingebettet sind, benötigt das JITting weniger Zeit, und die Startleistung von Apps verbessert sich. Der andere große Vorteil des zusammengesetzten gegenüber dem regulären ASP.NET-Image besteht darin, dass die zusammengesetzten Images auf dem Datenträger kleiner sind.
Es gibt einen zu beachtenden Vorbehalt. Da bei Zusammensetzungen mehrere Assemblys in eine eingebettet sind, weisen sie eine engere Versionskopplung auf. Apps können keine benutzerdefinierten Versionen von Framework- oder ASP.NET-Binärdateien verwenden.
Zusammengesetzte Images sind für die Plattformen Alpine Linux, Ubuntu („Jammy“) Chiseled und Mariner Distroless im Repository mcr.microsoft.com/dotnet/aspnet
verfügbar. Die Tags werden auf der ASP.NET Docker-Seite mit dem Suffix -composite
aufgeführt.
Containerveröffentlichung
- Standardeinstellungen für generierte Bilder
- Leistung und Kompatibilität
- Authentifizierung
- Im tar.gz-Archiv veröffentlichen
Standardeinstellungen für generierte Bilder
dotnet publish
kann Containerimages generieren. Standardmäßig werden non-root
-Images generiert, sodass Ihre Apps standardmäßig sicher sind. Ändern Sie diese Standardeinstellung jederzeit, indem Sie die Eigenschaft ContainerUser
festlegen, z. B. mit root
.
Das standardmäßige Ausgabecontainertag ist jetzt latest
. Dieser Standardwert entspricht anderen Tools im Containerbereich und erleichtert die Verwendung von Containern in inneren Entwicklungsschleifen.
Leistung und Kompatibilität
.NET 8 verfügt über eine verbesserte Leistung beim Pushen von Containern an Remoteregistrierungen, insbesondere an Azure-Registrierungen. Die Beschleunigung entsteht durch das Pushen von Ebenen in einem Vorgang und, für Registrierungen, die keine atomaren Uploads unterstützen, durch einen zuverlässigeren Blockerstellungsmechanismus.
Diese Verbesserungen führen auch dazu, dass mehr Registrierungen unterstützt werden: Harbor, Artifactory, Quay.io und Podman.
Authentifizierung
.NET 8 fügt Unterstützung für die OAuth-Tokenaustauschauthentifizierung (Azure Managed Identity) hinzu, wenn Container an Registrierungen übertragen werden. Diese Unterstützung bedeutet, dass Sie jetzt ohne Authentifizierungsfehler an Registrierungen wie Azure Container Registry per Push übertragen können. Die folgenden Befehle zeigen einen beispielhaften Veröffentlichungsfluss:
> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer
Weitere Informationen zum Containern von .NET-Apps finden Sie unter Containerize a .NET-App mit dotnet publish.
Im tar.gz-Archiv veröffentlichen
Ab .NET 8 können Sie einen Container direkt als Tar.gz-Archiv erstellen. Diese Funktion ist nützlich, wenn Ihr Workflow nicht einfach ist und erfordert, dass Sie beispielsweise ein Scantool über Ihre Bilder ausführen, bevor Sie diese pushen. Nachdem das Archiv erstellt wurde, können Sie es verschieben, scannen oder in eine lokale Docker-Toolkette laden.
Um sie in einem Archiv zu veröffentlichen, fügen Sie die ContainerArchiveOutputPath
Eigenschaft zu Ihrem dotnet publish
-Befehl hinzu, z. B.:
dotnet publish \
-p PublishProfile=DefaultContainer \
-p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz
Sie können entweder einen Ordnernamen oder einen Pfad mit einem bestimmten Dateinamen angeben.