Freigeben über


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 Befehl dotnet --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 auf ghcr.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

Nächste Schritte