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 commandedotnet --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
surghcr.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
- Annonce de la prise en charge intégrée des conteneurs pour le SDK .NET
- didacticiel : Conteneuriser une application .NET
- Images conteneur .NET
- Passer en revue les services Azure qui prennent en charge les conteneurs
- En savoir plus sur les commandes Dockerfile
- Explorer les outils de conteneur dans Visual Studio