Eine .NET-App mit dotnet publish containerisieren
Container verfügen über viele Features und Vorteile, z. B. eine unveränderliche Infrastruktur, bieten eine tragbare Architektur und ermöglichen skalierbarkeit. Das Image kann verwendet werden, um Container für Ihre lokale Entwicklungsumgebung, private Cloud oder öffentliche Cloud zu erstellen. In diesem Tutorial erfahren Sie, wie Sie eine .NET-Anwendung mithilfe des dotnet publish Befehls ohne Verwendung einer Dockerfile containerisieren. Außerdem entdecken Sie, wie Sie das Container-Image und die Ausführung konfigurieren und wie Sie Ressourcen bereinigen können.
Tipp
Wenn Sie ein Dockerfile zum Containerisieren Ihrer .NET-App verwenden möchten, lesen Sie die Anleitung: Containerisieren einer .NET-App.
Voraussetzungen
Die folgenden Komponenten müssen installiert sein:
- .NET 8+ SDK
Wenn .NET installiert ist, verwenden Sie den Befehldotnet --info
, um zu bestimmen, welches SDK Sie verwenden.
Wenn Sie den Container lokal ausführen möchten, benötigen Sie eine mit der Open Container Initiative (OCI) kompatible Container-Runtime, z. B.:
- Docker Desktop: Die allgemeinste Container-Runtime.
- Podman: Eine Open-Source-Daemonless-Alternative zu Docker.
Wichtig
Das .NET SDK erstellt Containerimages ohne Docker. Docker oder Podman sind nur erforderlich, wenn Sie das Image lokal ausführen möchten. Wenn Sie Ihre .NET App als Container-Image veröffentlichen, wird es standardmäßig an eine lokale Container-Runtime gepusht. Alternativ können Sie das Image als Tarball speichern oder es direkt in eine Container Registry pushen, ohne überhaupt eine Container-Runtime zu verwenden.
Zusätzlich zu diesen Voraussetzungen ist es empfehlenswert, dass Sie mit Worker-Diensten in .NET vertraut sind, da das Beispielprojekt ein Worker ist.
Erstellen einer .NET-App
Sie benötigen eine .NET-App zum Containerisieren. Beginnen Sie also mit dem Erstellen einer neuen App aus einer Vorlage. Öffnen Sie Ihr Terminal, erstellen Sie einen Arbeitsordner (sample-directory), falls noch nicht geschehen, und ändern Sie die Verzeichnisse so, dass Sie sich darin befinden. Führen Sie im Arbeitsordner den folgenden Befehl aus, um ein neues Projekt in einem Unterverzeichnis namens Workerzu erstellen:
dotnet new worker -o Worker -n DotNet.ContainerImage
Die Ordnerstruktur sieht ähnlich wie im folgenden Verzeichnis aus:
📁 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
Der Befehl dotnet new
erstellt einen neuen Ordner mit dem Namen Worker und generiert einen Workerdienst, der bei Ausführung jede Sekunde eine Nachricht protokolliert. Ändern Sie in Ihrer Terminalsitzung die Verzeichnisse, und navigieren Sie zum Ordner Worker. Verwenden Sie den Befehl dotnet run
, um die App zu starten.
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...
Die Workervorlage wird unbegrenzt in einer Schleife ausgeführt. Verwenden Sie den Befehl "Abbrechen" STRG+C, um ihn zu beenden.
Festlegen des Namens des Containerimages
Beim Veröffentlichen einer App als Container stehen verschiedene Konfigurationsoptionen zur Verfügung. Standardmäßig ist der Name des Containerimages der AssemblyName
des Projekts. Wenn dieser Name als Container-Imagename ungültig ist, können Sie ihn überschreiben, indem Sie eine ContainerRepository
angeben, wie in der Projektdatei unten gezeigt:
<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.0" />
</ItemGroup>
</Project>
Weitere Informationen finden Sie unter ContainerRepository
.
.NET-App veröffentlichen
Um die .NET-App als Container zu veröffentlichen, verwenden Sie den folgenden dotnet publish Befehl:
dotnet publish --os linux --arch x64 /t:PublishContainer
Der vorangehende .NET CLI-Befehl veröffentlicht die App als Container:
- Ausrichtung auf Linux als Betriebssystem (
--os linux
) - Angeben einer x64-Architektur (
--arch x64
).
Wichtig
Um den Container lokal zu veröffentlichen, müssen Sie über einen aktiven OCI-kompatiblen Daemon verfügen. Wenn er nicht ausgeführt wird, wenn Sie versuchen, die App als Container zu veröffentlichen, erhalten Sie eine Fehlermeldung ähnlich der folgenden:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
Der Befehl dotnet publish
erzeugt eine Ausgabe ähnlich der Beispielausgabe:
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
Dieser Befehl kompiliert Ihre App für Worker in den Ordner publish und pushes das Image des Containers standardmäßig an Ihren lokalen Docker-Daemon. Wenn Sie Podman verwenden, ein Alias
Veröffentlichen einer .NET-App in einem Tarball
Ein Tarball (oder Tar-Datei) ist eine Datei, die andere Dateien enthält. Es endet in der Regel mit einer *.tar.gz zusammengesetzten Dateierweiterung, um anzugeben, dass es sich um ein komprimiertes Archiv handelt. Diese Dateitypen werden verwendet, um Software zu verteilen oder Sicherungen zu erstellen. In diesem Fall wird die erstellte Tarball-Datei verwendet, um ein Container-Image zu verteilen.
Verwenden Sie den folgenden Befehl, um eine .NET-App als Container in einem Tarball zu veröffentlichen:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
Der vorangehende Befehl veröffentlicht die App als Container in einer Tarball-Datei:
- Ausrichtung auf Linux als Betriebssystem (
--os linux
). - Angeben einer x64-Architektur (
--arch x64
). - Legen Sie die Eigenschaft
ContainerArchiveOutputPath
auf./images/container-image.tar.gz
fest.
Der Befehl erfordert keinen laufenden OCI-kompatiblen Daemon. Weitere Informationen finden Sie unter ContainerArchiveOutputPath
.
Laden der Tarball
Ein allgemeiner Anwendungsfall für den Export in eine Tarball ist für Organisationen, die auf Sicherheit bedacht sind. Sie erstellen Container, exportieren sie als Tarballs und führen dann Sicherheitsscanner-Tools über die Tarballs aus. Dieser Ansatz vereinfacht die Compliance, da er die Komplexität des Scannens eines Live-Systems vermeidet.
Die Tarball enthält den gesamten Container, der dann mit dem entsprechenden Tool geladen werden kann:
- Docker:
docker load -i ./images/container-image.tar.gz
- Podman:
podman load -i ./images/container-image.tar.gz
Veröffentlichen einer .NET-App in einer Containerregistrierung
Container-Registries sind Dienste, die Container-Images speichern und verwalten. Sie werden verwendet, um die Container-Images in mehreren Umgebungen zu speichern und zu verteilen. Sie können eine .NET-App als Container in einer Containerregistrierung veröffentlichen, indem Sie den folgenden Befehl verwenden:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
Der vorangehende Code veröffentlicht die App als Container in einer Container Registry:
- Für Linux als Betriebssystem (
--os linux
). - Angeben einer x64-Architektur (
--arch x64
). - Legen Sie die Eigenschaft
ContainerRegistry
aufghcr.io
fest.
Weitere Informationen finden Sie unter ContainerRegistry.
Bereinigen von Ressourcen
In diesem Artikel haben Sie einen .NET-Worker als Containerimage veröffentlicht. Wenn Sie möchten, löschen Sie diese Ressource. Verwenden Sie den Befehl docker images
, um eine Liste der installierten Images anzuzeigen.
docker images
Betrachten Sie die folgende Beispielausgabe:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
Tipp
Bilddateien können groß sein. In der Regel entfernen Sie temporäre Container, die Sie beim Testen und Entwickeln Ihrer App erstellt haben. In der Regel behalten Sie die Basisimages mit installierter Runtime, wenn Sie planen, andere Images auf Basis dieser Runtime zu erstellen.
Um das Bild zu löschen, kopieren Sie die Bild-ID, und führen Sie den Befehl docker image rm
aus:
docker image rm 25aeb97a2e21