Partager via


Conteneuriser une application .NET avec dotnet publish

Les conteneurs présentent de nombreuses fonctionnalités et avantages, tels que l’utilisation d’une infrastructure immuable, la fourniture d’une architecture portable et l’activation de l’extensibilité. L’image peut être utilisée pour créer des conteneurs pour votre environnement de développement local, votre cloud privé ou votre cloud public. Dans ce tutoriel, vous allez apprendre à conteneuriser une application .NET à l’aide de la commande dotnet publish sans utiliser de fichier Dockerfile. En outre, vous allez découvrir comment configurer l’image conteneur et l’exécution, et comment nettoyer les ressources.

Conseil

Si vous souhaitez utiliser un dockerfile pour conteneuriser votre application .NET, consultez Tutoriel : Containerize a .NET app.

Conditions préalables

Installez les conditions préalables suivantes :

  • SDK .NET 8+
    Si vous avez installé .NET, utilisez la commande dotnet --info pour déterminer le Kit de développement logiciel (SDK) que vous utilisez.

Si vous envisagez d’exécuter le conteneur localement, vous avez besoin d’un runtime de conteneur compatible avec OCI (Open Container Initiative), par exemple :

  • Docker Desktop: runtime de conteneur le plus courant.
  • Podman: une alternative open source sans démon à Docker.

Important

Le Kit de développement logiciel (SDK) .NET crée des images conteneur sans Docker. Docker ou Podman sont nécessaires uniquement si vous souhaitez exécuter l’image localement. Par défaut, lorsque vous publiez votre application .NET en tant qu’image conteneur, elle est envoyée à un runtime de conteneur local. Vous pouvez également enregistrer l’image sous la forme d’un tarball ou l’envoyer directement à un registre de conteneurs sans utiliser du tout le runtime de conteneur.

En plus de ces prérequis, il est recommandé de vous familiariser avec Services Worker dans .NET, car l’exemple de projet est un worker.

Créer une application .NET

Vous avez besoin d’une application .NET pour conteneuriser. Commencez par créer une application à partir d’un modèle. Ouvrez votre terminal, créez un dossier de travail (sample-directory) si vous ne l’avez pas déjà fait et modifiez les répertoires afin que vous y soyez. Dans le dossier de travail, exécutez la commande suivante pour créer un projet dans un sous-répertoire nommé Worker:

dotnet new worker -o Worker -n DotNet.ContainerImage

Votre arborescence de dossiers ressemble au répertoire suivant :

📁 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

La commande dotnet new crée un dossier nommé Worker et génère un service worker qui, lors de l’exécution, enregistre un message toutes les secondes. À partir de votre session de terminal, changez de répertoire et accédez au dossier Worker. Utilisez la commande dotnet run pour démarrer l’application.

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...

Le modèle Worker effectue une boucle indéfiniment. Utilisez la commande Cancel Ctrl+C pour l’arrêter.

Définir le nom de l’image conteneur

Il existe différentes options de configuration disponibles lors de la publication d’une application en tant que conteneur. Par défaut, le nom de l’image conteneur est la AssemblyName du projet. Si ce nom n’est pas valide en tant que nom d’image conteneur, vous pouvez le remplacer en spécifiant un ContainerRepository comme indiqué dans le fichier projet suivant :

<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>

Pour plus d’informations de référence, consultez ContainerRepository.

Publier une application .NET

Pour publier l’application .NET sous forme de conteneur, utilisez la commande de publication dotnet suivante :

dotnet publish --os linux --arch x64 /t:PublishContainer

La commande CLI .NET précédente publie l’application en tant que conteneur :

  • Ciblage de Linux en tant que système d’exploitation (--os linux).
  • Spécification d’une architecture x64 (--arch x64).

Important

Pour publier le conteneur localement, vous devez disposer d’un démon compatible OCI actif en cours d’exécution. S’il n’est pas en cours d’exécution lorsque vous tentez de publier l’application en tant que conteneur, vous rencontrez une erreur similaire à ce qui suit :

..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
   The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]

La commande dotnet publish génère une sortie similaire à l’exemple de sortie :

Restore complete (0.2s)
  DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\

Cette commande compile votre application worker dans le dossier publier et envoie l’image conteneur à votre démon Docker local par défaut. Si vous utilisez Podman, un alias

Publier une application .NET sur un tarball

Un fichier tarball (ou un fichier tar) est un fichier qui contient d’autres fichiers. Il se termine généralement par un *.tar.gz extension de fichier composé pour indiquer qu’il s’agit d’une archive compressée. Ces types de fichiers sont utilisés pour distribuer des logiciels ou pour créer des sauvegardes. Dans ce cas, le tarball créé est utilisé pour distribuer une image de conteneur.

Pour publier une application .NET en tant que conteneur dans un tarball, utilisez la commande suivante :

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerArchiveOutputPath=./images/container-image.tar.gz

La commande précédente publie l’application en tant que conteneur dans un tarball :

  • Ciblage de Linux en tant que système d’exploitation (--os linux).
  • Spécification d’une architecture x64 (--arch x64).
  • Définition de la propriété ContainerArchiveOutputPath sur ./images/container-image.tar.gz.

La commande ne nécessite pas de démon conforme à OCI en cours d’exécution. Pour plus d’informations, consultez ContainerArchiveOutputPath.

Charger le tarball

Un cas d’usage courant pour l’exportation vers un tarball concerne les organisations axées sur la sécurité. Elles créent des conteneurs, les exportent en tant que tarballs, puis exécutent des outils de scan de sécurité sur les tarballs. Cette approche simplifie la conformité, car elle évite la complexité de l’analyse d’un système actif.

Le tarball contient l’intégralité du conteneur, qui peut ensuite être chargé à l’aide de l’outil approprié :

  • Docker: docker load -i ./images/container-image.tar.gz
  • Podman: podman load -i ./images/container-image.tar.gz

Publier une application .NET dans le registre de conteneurs

Les registres de conteneurs sont des services qui stockent et gèrent des images conteneur. Ils sont utilisés pour stocker et distribuer des images conteneur dans plusieurs environnements. Vous pouvez publier une application .NET en tant que conteneur dans un registre de conteneurs à l’aide de la commande suivante :

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerRegistry=ghcr.io

Le code précédent publie l’application en tant que conteneur dans un registre de conteneurs :

  • Ciblage de Linux en tant que système d’exploitation (--os linux).
  • Spécification d’une architecture x64 (--arch x64).
  • Définition de la propriété ContainerRegistry sur ghcr.io.

Pour plus d’informations, consultez ContainerRegistry.

Nettoyer les ressources

Dans cet article, vous avez publié un "worker" .NET sous forme d'une image de conteneur. Si vous le souhaitez, supprimez cette ressource. Utilisez la commande docker images pour afficher la liste des images installées.

docker images

Considérez l’exemple de sortie suivant :

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
dotnet-worker-image    1.0.0     25aeb97a2e21   12 seconds ago   191MB

Conseil

Les fichiers image peuvent être volumineux. En règle générale, vous supprimez les conteneurs temporaires que vous avez créés lors du test et du développement de votre application. Vous conservez généralement les images de base avec le runtime installé si vous prévoyez de générer d’autres images en fonction de ce runtime.

Pour supprimer l’image, copiez l’ID d’image et exécutez la commande docker image rm :

docker image rm 25aeb97a2e21

Étapes suivantes