Déboguer des applications dans un conteneur Docker local

Visual Studio fournit un moyen cohérent de développer sur un conteneur Docker et de valider votre application localement. Vous pouvez exécuter et déboguer vos applications dans des conteneurs Linux ou Windows s’exécutant sur votre bureau Windows local avec Docker installé, et vous n’avez pas besoin de redémarrer le conteneur chaque fois que vous faites une modification de code.

Cet article explique comment utiliser Visual Studio pour démarrer une application dans un conteneur Docker local, faire des modifications, puis actualiser le navigateur pour afficher les modifications. Cet article vous montre également comment définir des points d’arrêt pour le débogage des applications conteneurisées. Les types de projets pris en charge incluent l’application web, l’application console et la fonction Azure ciblant .NET Framework et .NET Core. Les exemples présentés dans cet article sont un projet de type application web ASP.NET Core et un projet de type application console (.NET Framework).

Si vous disposez déjà d’un projet d’un type pris en charge, Visual Studio peut créer un Dockerfile et configurer votre projet pour qu’il s’exécute dans un conteneur. Voir Outils de conteneur dans Visual Studio.

Prérequis

Pour déboguer des applications dans un conteneur Docker local, les outils suivants doivent être installés :

Pour exécuter des conteneurs Docker localement, vous devez disposer d’un client Docker local. Vous pouvez utiliser Docker Desktop, qui exige Windows 10 ou version ultérieure.

Créer une application web

Si vous avez un projet et que vous avez ajouté la prise en charge de Docker comme décrit dans la vue d’ensemble, ignorez cette section.

  1. Dans la fenêtre de démarrage Visual Studio, sélectionnez Créer un projet.

  2. Sélectionnez Application web ASP.NET Core, puis Suivant.

  3. Entrez un nom pour votre nouvelle application (ou utilisez le nom par défaut), spécifiez l’emplacement sur le disque, puis sélectionnez Suivant.

  4. Choisissez la version .NET que vous souhaitez cibler. Si vous ne le savez pas, choisissez la version LTS (prise en charge à long terme).

    Créer un projet web - Écran Informations supplémentaires

  5. Indiquez si vous souhaitez la prise en charge SSL en cochant ou en décochant la case Configurer pour HTTPS.

  6. Cochez la case Activer la prise en charge de Docker.

  7. Sélectionnez le type de conteneur souhaité (Windows ou Linux), puis sélectionnez Créer.

  1. Dans la fenêtre de démarrage Visual Studio, sélectionnez Créer un projet.

  2. Sélectionnez Application web ASP.NET Core, puis Suivant.

  3. Entrez un nom pour votre nouvelle application (ou utilisez le nom par défaut), spécifiez l’emplacement sur le disque, puis sélectionnez Suivant.

  4. Choisissez la version .NET que vous souhaitez cibler. Si vous ne le savez pas, choisissez la version LTS (prise en charge à long terme).

    Créer un projet web - Écran Informations supplémentaires

  5. Indiquez si vous souhaitez la prise en charge SSL en cochant ou en décochant la case Configurer pour HTTPS.

  6. Cochez la case Activer Docker.

  7. Dans la zone de texte Docker OS, sélectionnez le type de conteneur souhaité (Windows ou Linux), puis sélectionnez Créer.

Modifier vos pages Razor et actualiser

Pour itérer rapidement les modifications apportées à vos pages Razor, vous pouvez démarrer votre application dans un conteneur. Ensuite, continuez à apporter des modifications, en les affichant comme vous le feriez avec IIS Express.

  1. Assurez-vous que Docker est configuré pour utiliser le type de conteneur (Linux ou Windows) que vous utilisez. Cliquez avec le bouton droit sur l’icône Docker dans la barre des tâches, puis choisissez Basculer vers des conteneurs Linux ou Basculer vers des conteneurs Windows le cas échéant.

  2. (.NET Core 3 et versions ultérieures uniquement) La modification de votre code et l’actualisation du site en cours d’exécution comme décrit dans cette section ne sont pas activées dans les modèles par défaut dans .NET Core >= 3.0. Pour l’activer, ajoutez le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. Dans Startup.cs, ajoutez un appel à la méthode d’extension IMvcBuilder.AddRazorRuntimeCompilation au code de la méthode ConfigureServices. Vous n’avez besoin de l’activer qu’en mode DEBUG. Par conséquent, codez-le comme suit :

    public IWebHostEnvironment Env { get; set; }
    
    public void ConfigureServices(IServiceCollection services)
    {
        IMvcBuilder builder = services.AddRazorPages();
    
    #if DEBUG
        if (Env.IsDevelopment())
        {
            builder.AddRazorRuntimeCompilation();
        }
    #endif
    
        // code omitted for brevity
    }
    

    Modifiez la méthode Startup comme suit :

    public Startup(IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
    {
        Configuration = configuration;
        Env = webHostEnvironment;
    }
    

    Pour plus d’informations, consultez Compilation de fichiers Razor dans ASP.NET Core.

  3. Définissez Configuration de solution sur Déboguer. Puis, appuyez sur Ctrl+F5 pour créer votre image Docker et l’exécuter localement.

    Lorsque l’image de conteneur est créée et exécutée dans un conteneur Docker, Visual Studio lance l’application web dans votre navigateur par défaut.

  4. Accédez à la page Index. Nous apporterons des modifications sur cette page.

  5. Revenez à Visual Studio et ouvrez Index.cshtml.

  6. Ajoutez le contenu HTML suivant à la fin du fichier, puis enregistrez les modifications.

    <h1>Hello from a Docker container!</h1>
    
  7. Dans la fenêtre de sortie, lorsque le build .NET est terminé et que vous voyez ces lignes, revenez sur votre navigateur et actualisez la page :

    Now listening on: http://*:80
    Application started. Press Ctrl+C to shut down.
    

Vos modifications ont été appliquées !

Déboguer à l’aide de points d’arrêt

Souvent, les modifications nécessitent une inspection plus approfondie. Vous pouvez utiliser les fonctionnalités de débogage de Visual Studio pour cette tâche.

  1. Dans Visual Studio, ouvrez Index.cshtml.cs.

  2. Remplacez le contenu de la méthode OnGet par le code suivant :

        ViewData["Message"] = "Your application description page from within a container";
    
  3. À gauche de la ligne de code, définissez un point d’arrêt.

  4. Pour démarrer le débogage et atteindre le point d’arrêt, appuyez sur F5.

  5. Basculez vers Visual Studio pour afficher le point d’arrêt. Inspecter les valeurs.

    Capture d’écran indiquant une partie du code pour Index.cshtml.cs dans Visual Studio avec un point d’arrêt défini à gauche d’une ligne de code mise en évidence en jaune.

    Capture d’écran indiquant une partie du code pour Index.cshtml.cs dans Visual Studio avec un point d’arrêt défini à gauche d’une ligne de code mise en évidence en jaune.

Créer une application console .NET Framework

Cette section explique comment déboguer un projet d’application console .NET Framework dans un conteneur Docker local, en indiquant d’abord comment ajouter la prise en charge Docker au projet. Il est important de reconnaître que les différents types de projets ont différents niveaux de prise en charge de Docker. Il existe même différents niveaux de prise en charge de Docker pour les projets d’application console .NET Core (y compris .NET 5 et versions ultérieures) par rapport aux projets d’application console .NET Framework.

Lorsqu’un projet d’application console .NET Framework est créé, il n’existe aucune option permettant d’activer la prise en charge de Docker. Après avoir créé un tel projet, il n’existe aucun moyen d’ajouter explicitement la prise en charge de Docker au projet. Pour un projet d’application console .NET Framework, il est possible d’ajouter la prise en charge de l’orchestration de conteneurs. Un effet secondaire de l’ajout de la prise en charge de l’orchestration au projet d’application console .NET Framework est qu’il ajoute la prise en charge de Docker au projet.

La procédure suivante montre comment ajouter la prise en charge de l’orchestration à un projet d’application console .NET Framework, qui ajoute ensuite la prise en charge Docker au projet et permet au projet d’être débogué dans un conteneur Docker local.

  1. Créez un projet d’application console .NET Framework.
  2. Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Ajouter>la prise en charge de l’orchestration de conteneur. Dans la boîte de dialogue qui s’affiche, sélectionnez Docker Compose. Un Dockerfile est ajouté à votre projet et un projet Docker Compose avec les fichiers de support associés est ajouté.

Déboguer à l’aide de points d’arrêt

  1. Dans l’Explorateur de solutions, ouvrez Program.cs.

  2. Remplacez le contenu de la méthode Main par le code suivant :

        System.Console.WriteLine("Hello, world!");
    
  3. Définissez un point d’arrêt à gauche de la ligne de code.

  4. Appuyez sur F5 pour démarrer le débogage et atteindre le point d’arrêt.

  5. Basculez sur Visual Studio pour afficher le point d’arrêt, puis inspectez les valeurs.

    Capture d’écran du code pour Programe.cs dans Visual Studio avec un point d’arrêt défini à gauche d’une ligne de code mise en évidence en jaune.

Authentification sur les services Azure avec le proxy de jeton

Quand vous utilisez des services Azure à partir d’un conteneur, vous pouvez utiliser DefaultAzureCredential (avec VisualStudioCredential activé) pour vous authentifier sur les services Azure avec votre compte Microsoft Entra sans aucune configuration supplémentaire dans le conteneur. Pour l’activer, consultez Comment configurer les outils de conteneur Visual Studio. Par ailleurs, vous devez configurer l’authentification Azure dans Visual Studio en suivant les instructions sur Authentifier Visual Studio avec Azure. La prise en charge de VisualStudioCredential dans un conteneur est disponible dans Visual Studio version 17.6 et ultérieure.

Azure Functions

Si vous déboguez un projet Azure Functions intégré et que vous utilisez le proxy de jeton dans le conteneur pour gérer l’authentification sur les services Azure, vous devez copier le runtime .NET sur le conteneur pour que le proxy de jeton s’exécute. Si vous déboguez un projet Azure Functions isolé, il a déjà le runtime .NET, donc vous n’avez pas besoin de cette étape supplémentaire.

Pour que le runtime .NET soit disponible pour le proxy de jeton, ajoutez ou modifiez la couche debug dans le fichier Dockerfile qui copie le runtime .NET dans l’image conteneur. Pour les conteneurs Linux, vous pouvez ajouter le code suivant au fichier Dockerfile :

# This layer is to support debugging, VS's Token Proxy requires the runtime to be installed in the container
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
FROM base as debug
COPY --from=runtime /usr/share/dotnet /usr/share/dotnet
RUN ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Par ailleurs, dans le projet Visual Studio, vous devez faire quelques changements pour la spécifier comme étant la couche à utiliser pendant le débogage en mode rapide. Pour plus d'informations sur le mode rapide, consultez Personnaliser les conteneurs Docker dans Visual Studio. Pour les scénarios avec un seul conteneur (et non Docker Compose), définissez la propriété MSBuild DockerfileFastModeStage sur debug afin d’utiliser cette couche pour le débogage. Pour Docker Compose, modifiez le fichier docker-compose.vs.debug.yml de la façon suivante :

# Set the stage to debug to use an image with the .NET runtime in it
services:
  functionappintegrated:
    build:
      target: debug

Pour obtenir un exemple de code d’authentification avec Azure Functions, notamment des scénarios intégrés et isolés, consultez VisualStudioCredentialExample.

Réutilisation des conteneurs

Quand vous utilisez le mode rapide, que Visual Studio utilise normalement pour la configuration Debug, Visual Studio regénère uniquement vos images conteneur et le conteneur lui-même quand vous changez le fichier Dockerfile. Si vous ne modifiez pas le Dockerfile, Visual Studio réutilise le conteneur d’une exécution antérieure.

Si vous avez modifié manuellement votre conteneur et que vous souhaitez redémarrer avec une image conteneur propre, utilisez la commande Build>Clean dans Visual Studio, puis créez normalement.

Quand vous n’utilisez pas le mode rapide, ce qui est typique de la configuration Release, Visual Studio regénère le conteneur chaque fois que le projet est généré.

Pour configurer l’utilisation du mode rapide, consultez Comment configurer les outils de conteneur Visual Studio.

Résoudre les problèmes

Découvrez comment résoudre les problèmes de développement Docker de Visual Studio.

Pour plus d’informations, consultez Comment Visual Studio génère des applications conteneurisées.

En savoir plus sur Docker avec Visual Studio, Windows et Azure