.NET 7 : Dockeriser une API et activer le débogage dans le conteneur à travers VSCode

Le but de cette article est de vous montrer comment conteneuriser une API web avec ASP.NET Core.

Prérequis :

Création du projet API :

1 . Créer un nouveau projet API web avec Visual Studio Code

  • Dans le répertoire où vous souhaitez créer votre projet, faites un clic droit et “Ouvrir dans le terminal”.
  • Dans le terminal, exécuter les commandes suivantes :
dotnet new webapi --no-https -o MyWebApi  //Création d'un projet nommé "MyWebApi"

cd MyWebApi  //Se déplacer dans le repertoire du projet

dotnet add package Microsoft.EntityFrameworkCore.InMemory  //Ajout du package NuGet pour simuler une base de données en mémoire

code -r ../MyWebApi  //Ouvrir le projet dans Visual Studio Code

/!\ Il est important de créer le projet sans HTTPS car lors de la conteneurisation, il faut que le conteneur docker créer soit en HTTP /!\

2 . Tester l’application

  • Dans le terminal VSCode (CTRL + Shift + ù), exécuter la commande suivante :
dotnet run  //Lancer l'application

=> le <port> est visible dans le terminal à la suite de la commande “dotnet run”

  • Vous devriez avoir un résultat similaire qui s’affiche :

=> l’interface Swagger s’affiche

  • Dans l’interface Swagger, cliquer sur :

– GET /weatherforecast

– Try it out

– Execute

Vous devriez avoir le même résultat que précédemment :

    [
       {
          "date":"2022-12-15",
          "temperatureC":-19,
          "temperatureF":-2,
          "summary":"Balmy"
       },
       {
          "date":"2022-12-16",
          "temperatureC":-20,
          "temperatureF":-3,
          "summary":"Chilly"
       },
       {
          "date":"2022-12-17",
          "temperatureC":24,
          "temperatureF":75,
          "summary":"Balmy"
       },
       {
          "date":"2022-12-18",
          "temperatureC":31,
          "temperatureF":87,
          "summary":"Chilly"
       },
       {
          "date":"2022-12-19",
          "temperatureC":7,
          "temperatureF":44,
          "summary":"Sweltering"
       }
   ]

Les erreurs que vous pouvez rencontrer à cette étape :

Si vous allez sur la page http://localhost:<port > , une page d’erreur 404 doit s’afficher. C’est normal les url à saisir sont http://localhost:<port>/weatherforecast ou http://localhost:<port>/swagger/index.html.

Si vous souhaitez complexifier votre API, vous pouvez suivre le tutoriel officiel de Microsoft à partir de cette partie : https://learn.microsoft.com/fr-fr/aspnet/core/tutorials/first-web-api?view=aspnetcore-7.0&tabs=visual-studio-code#add-a-model-class

Conteneurisation de l’API :

1 . Création du fichier Dockerfile :

  • Ouvrir la palette de commande (CTRL + Shift + P)
  • Taper “.NET: Generate Assets for Build and Debug”

Cette commande permet de créer les fichiers launch.json et task.json qui permettent le débogage sur VSCode.

  • Ré-ouvrir la palette de commande (CTRL + Shift + P)
  • Taper “Docker: Add Docker Files to Workspace”

  • Sélectionner “.NET: ASP.NET Core”

  • Sélectionner “Linux” pour le système d’exploitation

  • Entrez le port de votre choix (ex: 5000)

  • Sélectionner “No” pour le fichier docker-compose car nous n’avons pas plusieurs conteneurs à créer

  • Les fichiers Dockerfile et .dockerignore ont été généré
  • Ouvrer le Dockerfile
  • Ajouter la ligne en gras :
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 5000

ENV ASPNETCORE_URLS=http://+:5000
ENV ASPNETCORE_ENVIRONMENT=Development //Permet d'afficher l'interface UI de Swagger

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["MyWebApi.csproj", "./"]
RUN dotnet restore "MyWebApi.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyWebApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyWebApi.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWebApi.dll"]

2 . Build l’application

  • Dans le terminal VSCode (CTRL + Shift + ù), exécuter la commande suivante :
dotnet build

3 . Création de l’image docker

  • Dans le terminal VSCode (CTRL + Shift + ù), exécuter la commande suivante :
docker build -t mywebapi:latest .

Ici -t sert a préciser le tag de l’image que l’on créer et permet de préciser la version de l’image.

  • Vérifier que l’image a bien été créer avec la commande grâce à l’interface docker de VSCode :

  • ou avec la commande suivante :
docker images

  • Avant de construire le container assurez vous que le port 5000 n’est pas utilisé par un autre service. C’est à dire qu’il faut que votre “dotnet run” de test de l’API (Etape 2 . Test de l’application) ne soit pas en cours d’exécution, soit en fermant le terminal ou en faisant CTRL + C dans le terminal.

4 . Création du container

  • Dans le terminal VSCode (CTRL + Shift + ù), exécuter la commande suivante :
docker run --rm -d -p 5000:5000/tcp --name mywebapi mywebapi:latest

rm : permet de supprimer le container dès qu’il sera stoppé

-d : permet de démarrer le container en mode détaché

-p 5000:5000/tcp : permet de préciser le port de l’hôte que l’on associe au port du container

name mywebapi : permet de préciser le nom du container que l’on créer, ici “mywebapi”

  • Vérifier que le container a bien été créé avec l’interface docker de VSCode :

  • ou avec la commande :
docker ps

=> l’interface Swagger doit apparaître comme vu précédemment.

Déboguer le container :

  • Dans “Run and Debug” de VSCode (CTRL + SHIFT + D)

  • Cliquer sur “Add Configuration” (c’est peut être écrit .NET Core Launch (web)) et selectionner “Docker .NET Core Launch”

  • Aller dans ./Controllers/WeatherForecastController.cs et ajouter un point d’arrêt sur la ligne 20

  • Cliquer sur la flèche verte pour lancer le débogage

=> l’interface Swagger s’affiche comme précédemment

  • Tester l’API:
    • GET /weatherforecast
    • Try it out
    • Execute
    • Observer que la page est en “Loading”

  • Dans ./Controllers/WeatherForecastController.cs observer le breakpoint

Déboguer en local :

Le principe est le même que la partie ci-dessus mise à part qu’il ne faut pas sélectionner : “Docker .NET Core Launch” mais “.NET Core Launch (web)” pour lancer le débogage en local.

Laisser un commentaire

%d blogueurs aiment cette page :