Objectifs et cours associés
Comparer une image avec SDK et une image issue d’une construction multistage.
Pour réviser les notions utilisées dans ce TP :
Préparation
Prérequis
Configuration pour Windows
Guide : Préparer Docker pour les TP
Les commandes se feront directement depuis un terminal PowerShell.
Configuration pour Linux
Compte student, membre de devops, avec accès sudo ; terminal Linux et systemd.
Guide : Préparer Linux pour les TP
Moteur Docker et Compose disponibles.
Guide : Préparer Docker pour les TP
Dans le terminal Linux, entrer dans student si nécessaire :
Terminal Linux
su - studentSi vous êtes déjà connecté avec student, conserver cette session.
Dépendances
Configuration pour Windows
Ouvrir Docker Desktop depuis le menu Démarrer et attendre que le moteur fonctionne, en mode conteneurs Linux.
Terminal Windows — PowerShell
docker version
docker compose versiondocker version doit afficher Client et Server. Si Server est indisponible, attendre le démarrage du moteur ou corriger Docker Desktop avant de poursuivre. Utiliser PowerShell 7.4 ou ultérieur pour les scripts .ps1 fournis.
Ressources et point de départ
Télécharger les archives ci-dessous, puis les copier et les extraire avec les commandes fournies.
Copier et extraire les archives téléchargées :
Terminal Windows — PowerShell
mkdir "$env:USERPROFILE/devops-formation/tp-05-03" -Force
cd "$env:USERPROFILE/devops-formation/tp-05-03"
cp "$env:USERPROFILE/Downloads/todo-list-sources.zip" . -Force
Expand-Archive ./todo-list-sources.zip -DestinationPath . -Force
mkdir "$env:USERPROFILE/devops-formation/tp-05-03/todo-list-fault" -Force
cd "$env:USERPROFILE/devops-formation/tp-05-03/todo-list-fault"
cp "$env:USERPROFILE/Downloads/tp-03-fault.zip" . -Force
Expand-Archive ./tp-03-fault.zip -DestinationPath . -Force
cd "$env:USERPROFILE/devops-formation/tp-05-03"
ls -ForceL’application du TP sera lancée dans son conteneur ; aucun runtime applicatif à installer sur l’hôte.
Lire les fichiers du TP
Avec Visual Studio Code et la commande code disponibles, ouvrez le dossier préparé ci-dessus :
Terminal Windows — PowerShell
cd "$env:USERPROFILE/devops-formation/tp-05-03"
code .Dans VS Code, lisez Dockerfile.sdk, Dockerfile et .dockerignore.
Repérez les étapes de compilation du front et de publication .NET, puis les fichiers copiés dans l’image finale.
Configuration pour Linux
Utiliser le moteur préparé par le guide commun :
Terminal Linux
docker version
docker compose versionClient et Server doivent être disponibles. Les services applicatifs seront lancés par les commandes du TP ; ne pas installer les serveurs web ou bases de données sur le poste.
Ressources et point de départ
Télécharger les archives ci-dessous, puis les copier et les extraire avec les commandes fournies.
Copier et extraire les archives téléchargées (avec unzip installé) :
Terminal Linux — Bash
mkdir -p ~/devops-formation/tp-05-03
cd ~/devops-formation/tp-05-03
cp ~/Downloads/todo-list-sources.zip .
unzip -o ./todo-list-sources.zip -d .
mkdir -p ~/devops-formation/tp-05-03/todo-list-fault
cd ~/devops-formation/tp-05-03/todo-list-fault
cp ~/Downloads/tp-03-fault.zip .
unzip -o ./tp-03-fault.zip -d .
cd ~/devops-formation/tp-05-03
ls -aL’application du TP sera lancée dans son conteneur ; aucun runtime applicatif à installer sur l’hôte.
Lire les fichiers du TP
Avec Visual Studio Code et la commande code disponibles, ouvrez le dossier préparé ci-dessus :
Terminal Linux — Bash
cd ~/devops-formation/tp-05-03
code .Dans VS Code, lisez Dockerfile.sdk, Dockerfile et .dockerignore.
Repérez les étapes de compilation du front et de publication .NET, puis les fichiers copiés dans l’image finale.
Étape 1 : Construire les images SDK et multistage
Avec le compte de travail, créer le dossier du TP puis s’y placer :
Terminal Windows — PowerShell
# Créer le dossier indiqué pour les fichiers de travail du TP.
mkdir "$env:USERPROFILE/devops-formation/tp-05-03"
# Se placer dans le dossier requis pour les commandes suivantes.
cd "$env:USERPROFILE/devops-formation/tp-05-03"Avec le compte de travail, créer le dossier du TP puis s’y placer :
Terminal Linux
# Créer le dossier indiqué pour les fichiers de travail du TP.
mkdir -p ~/devops-formation/tp-05-03
# Se placer dans le dossier requis pour les commandes suivantes.
cd ~/devops-formation/tp-05-03Construisez les deux images à partir des Dockerfiles étudiés dans les dépendances.
La première conserve le SDK .NET ; la seconde utilise une construction multistage avec une image finale d’exécution.
Les étapes suivantes compareront leur fonctionnement et leur contenu.
Construisez les deux variantes de l’image.
Commandes selon votre OS
Terminal — PowerShell (Windows) ou Bash (Linux)
# Construire et taguer l’image à partir du Dockerfile et du contexte indiqués.
docker build --progress=plain -f Dockerfile.sdk -t asd-tp03-sdk:1.0 .
# Construire et taguer l’image à partir du Dockerfile et du contexte indiqués.
docker build --progress=plain -f Dockerfile -t asd-todo:1.0 .Observer avant de poursuivre : Les deux builds ont une étape front. L’image avec SDK conserve les outils de compilation .NET ; l’autre utilise aspnet pour exécuter la publication dépendante du runtime. Ni Node ni SDK .NET ne sont à installer sur l’hôte.
Conclusion : La construction multistage copie les artefacts nécessaires dans une étape finale distincte ; les outils de compilation n’ont pas à être conservés dans cette image.
Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.7 Multi-stage ; 3.4 Contexte.
Différence entre les deux Dockerfiles
Dockerfile.sdk conserve le SDK .NET, qui contient les outils de compilation, dans l’image finale.
Dans Dockerfile, nous ajoutons une dernière étape :
# Démarrer une étape de construction basée sur l’image indiquée.
FROM mcr.microsoft.com/dotnet/aspnet:8.0.15-bookworm-slim AS runtimeCe nouveau FROM démarre une étape indépendante, basée sur une image contenant le runtime ASP.NET nécessaire à l’exécution, sans le SDK.
Nous y copions uniquement l’application compilée depuis l’étape build :
# Copier les artefacts de l’étape de construction vers l’image finale.
COPY --from=build /out/ ./Les outils de compilation restent dans l’étape build et ne sont pas embarqués dans l’image finale.
Le nom runtime désigne cette étape ; c’est le choix de l’image après FROM qui détermine son contenu.
La ligne COPY --from=front ajoute aussi les fichiers du front déjà compilés, sans embarquer les outils Node.
Étape 2 : Vérifier le même service
Le healthcheck est un mode de l’exécutable C# ; curl n’est pas supposé disponible dans l’image.
Commandes selon votre OS
Terminal — PowerShell (Windows) ou Bash (Linux)
# Créer et démarrer un conteneur avec l’image, les ports et les montages indiqués.
docker run -d --name asd-tp03-sdk -p 127.0.0.1:8084:8080 asd-tp03-sdk:1.0
# Créer et démarrer un conteneur avec l’image, les ports et les montages indiqués.
docker run -d --name asd-tp03-runtime -p 127.0.0.1:8085:8080 asd-todo:1.0
# Interroger le point de santé et observer le code HTTP retourné.
curl -f http://127.0.0.1:8084/healthz
# Interroger le point de santé et observer le code HTTP retourné.
curl -f http://127.0.0.1:8085/healthz
# Envoyer la requête HTTP et examiner la réponse du service ciblé.
curl -I http://127.0.0.1:8085/
# Tester une opération de l’API et observer sa réponse métier ou son erreur HTTP.
curl -i http://127.0.0.1:8085/api/tasks
# Lancer le contrôle de santé prévu par l’application dans le conteneur.
docker exec asd-tp03-runtime dotnet Todo.dll --healthcheckObserver avant de poursuivre : Deux healthz=200, fichiers du front servis. Le CRUD retourne 503 sans base : ce résultat est attendu ici et ne remet pas en cause la santé du processus API.
Conclusion : Les contrôles de santé et le service des fichiers web peuvent réussir alors que /api/tasks renvoie 503 faute de base de données ; la santé du processus ne garantit pas la disponibilité de toutes ses fonctions.
Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.7 Multi-stage ; 3.4 Contexte.
Étape 3 : Mesurer au lieu de supposer
Nous allons maintenant comparer les deux images pour mesurer l’effet de la construction multistage.
Relevez leur taille en octets, puis vérifiez que le SDK .NET est présent dans l’image SDK et absent de l’image finale multistage.
Vérifiez également que cette dernière conserve les runtimes nécessaires à l’exécution de l’application.
Commandes selon votre OS
Terminal — PowerShell (Windows) ou Bash (Linux)
# Comparer les tailles des deux images, exprimées en octets.
docker image inspect asd-tp03-sdk:1.0 asd-todo:1.0 --format '{{.RepoTags}} taille={{.Size}}'
# Vérifier si le conteneur contient le SDK .NET : une liste vide indique son absence.
docker exec asd-tp03-sdk dotnet --list-sdks
# Vérifier si le conteneur contient le SDK .NET : une liste vide indique son absence.
docker exec asd-tp03-runtime dotnet --list-sdks
# Vérifier que les runtimes .NET nécessaires à l’exécution sont présents.
docker exec asd-tp03-runtime dotnet --list-runtimesObserver avant de poursuivre : Comparez la taille en octets des deux images : l’image multistage doit être plus petite que celle qui conserve le SDK.
Le SDK apparaît dans asd-tp03-sdk, mais pas dans asd-tp03-runtime ; les runtimes nécessaires à l’exécution restent présents dans cette dernière.
Conclusion : Dans cet exemple, le contenu compressé passe de 342 MB à 92,7 MB, soit environ 73 % de réduction grâce à la construction multistage. La comparaison des SDK et runtimes confirme que les outils de compilation ont été retirés de l’image finale tout en conservant ce qui permet d’exécuter l’application.
Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.7 Multi-stage ; 3.4 Contexte.
Identifiant d’image et digest de registre
Avec la commande suivante, nous pouvons examiner les informations des deux images :
# Afficher les informations des deux images pour examiner Id et RepoDigests.
docker image inspect asd-tp03-sdk:1.0 asd-todo:1.0Deux champs sont intéressants :
Id: l’empreinte SHA-256 de la configuration de l’image locale. Elle permet notamment de vérifier si deux tags désignent la même image locale : mêmeId, même image.RepoDigests: les références connues sous la formedépôt@sha256:…. Chaque référence associe un dépôt au digest d’un manifeste ou d’un index dans un registre. Ce champ devrait être vide pour nos images construites localement, car nous ne les avons pas publiées.
Pourquoi utiliser un digest plutôt qu’un tag ?
Un tag est une étiquette que l’on peut réaffecter à une autre image.
Par exemple, les tags asd-tp03-sdk:1.0 et asd-todo:1.0 désignent actuellement les images que nous venons de construire. Ils peuvent être réaffectés à d’autres images lors d’une prochaine construction avec les mêmes tags. Dans un registre, une nouvelle publication sous un même tag peut également remplacer l’image qu’il désigne.
Une référence par digest permet de demander exactement le même contenu publié, même si le tag a été déplacé depuis.
Un digest est immuable : il ne change jamais. Si une reconstruction produit un contenu différent, celui-ci possède un autre digest ; l’ancien reste associé à son contenu initial. Une reconstruction à l’identique ne produit donc pas nécessairement un nouveau digest.
Pour approfondir : 3.5 — Identifier les images : noms, tags et digests.
Alternative : docker image ls asd-*
Vous pouvez aussi afficher les images dont le nom commence par asd-.
Voici un exemple de résultat ; les identifiants et les tailles peuvent différer sur votre poste.
# Lister les images correspondant au filtre pour vérifier leur présence.
docker image ls asd-*
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
asd-todo:1.0 4a820dd8d40a 329MB 92.7MB U
asd-tp02-web:1.0 466ad37191f3 73.7MB 21MB U
asd-tp03-sdk:1.0 80ef4daa6f3f 1.27GB 342MB U
# Lire les métadonnées de l’image pour contrôler son identité ou sa construction.
docker image inspect asd-tp03-sdk:1.0 asd-todo:1.0 --format '{{.RepoTags}} {{.Size}}'
[asd-tp03-sdk:1.0] 341773478
[asd-todo:1.0] 92656081Avec le stockage containerd, les deux colonnes mesurent des choses différentes :
- CONTENT SIZE : taille du contenu compressé de l’image.
- DISK USAGE : occupation locale comprenant le contenu compressé et les couches décompressées utilisées pour exécuter les conteneurs. Le stockage containerd conserve ces deux formes.
Dans cet exemple, le champ .Size de docker image inspect correspond à CONTENT SIZE, exprimé en octets : 341773478 octets donnent environ 342 MB, et 92656081 octets environ 92,7 MB.
Il ne correspond pas à la colonne DISK USAGE.
Pour comparer les images, utilisez la même mesure pour les deux et calculez la réduction à partir de vos résultats.
Étape 4 : Diagnostiquer une erreur COPY ciblée
Le ZIP tp-04-fault est extrait dans le sous-dossier todo-list-fault. Il contient toutes les sources et un Dockerfile dont une seule source COPY est incorrecte.
Commandes selon votre OS
Terminal Windows — PowerShell
# Se placer dans le dossier requis pour les commandes suivantes.
cd "$env:USERPROFILE/devops-formation/tp-05-03/todo-list-fault"
# Construire et taguer l’image à partir du Dockerfile et du contexte indiqués.
docker build --progress=plain -t asd-tp03-fault:1.0 .Terminal Linux — Bash
# Se placer dans le dossier requis pour les commandes suivantes.
cd ~/devops-formation/tp-05-03/todo-list-fault
# Construire et taguer l’image à partir du Dockerfile et du contexte indiqués.
docker build --progress=plain -t asd-tp03-fault:1.0 .Observer avant de poursuivre : Build en échec : relever la ligne COPY --from et le chemin recherché. Comparer à la sortie de dotnet publish. Corriger le chemin puis reconstruire et tester /healthz. Le corrigé détaillé est fourni séparément ; aucune image ne peut être produite tant que ce build échoue.
Correctif : vérifier le chemin de COPY
Dans le Dockerfile fautif, l’instruction RUN dotnet publish -c Release -o /out --no-restore produit les fichiers de l’application dans /out, à l’intérieur de l’étape build.
Le chemin /publication-absente/ utilisé par COPY --from=build n’existe pas dans cette étape.
Remplacez uniquement cette instruction par :
# Copier la publication réellement produite dans l’étape build vers /app.
COPY --from=build /out/ ./Cette ligne est celle du Dockerfile fonctionnel étudié au début du TP.
Depuis le dossier todo-list-fault où vous êtes déjà placé, reconstruisez l’image, puis vérifiez que l’application répond :
Terminal — PowerShell (Windows) ou Bash (Linux)
# Vérifier que la construction réussit après la correction du chemin COPY.
docker build --progress=plain -t asd-tp03-fault:1.0 .
# Démarrer l’image corrigée dans un conteneur de vérification.
docker run -d --name asd-tp03-correction -p 127.0.0.1:8089:8080 asd-tp03-fault:1.0
# Attendre le démarrage et vérifier que le point de santé répond sans erreur.
curl --retry 10 --retry-connrefused --retry-delay 1 -f http://127.0.0.1:8089/healthzÀ observer : le build franchit l’instruction COPY et termine sans l’erreur de chemin initiale ; /healthz répond HTTP 200.
Comme seul le chemin source de COPY a été modifié, cette comparaison confirme la cause de l’échec initial.
Conclusion : COPY --from doit viser un chemin réellement produit dans l’étape source ; une construction puis un test /healthz réussis confirment la correction du chemin fautif.
Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.7 Multi-stage ; 3.4 Contexte.
Vérification finale
- Deux images construites, tailles et SDK relevés.
- Healthz et front vérifiés, absence de base comprise.
- Erreur de build localisée et corrigée.
Retenir
Réponses aux trois repères du TP
- COPY --from transfère les artefacts d’une étape.
- Le runtime reste nécessaire pour cette publication.
- Build produit une image, run crée/exécute un conteneur.
Nettoyage
Dépendances
Configuration pour Windows
Dans PowerShell, avec Docker Desktop démarré, exécutez le nettoyage suivant.
Nettoyage ciblé et reprise
Commandes selon votre OS
docker rm -f asd-tp03-sdk asd-tp03-runtime asd-tp03-correction
docker image rm asd-tp03-sdk:1.0
# Conserver asd-todo:1.0 pour les TP suivants.Vos fichiers restent dans $env:USERPROFILE/devops-formation/tp-05-03.
Supprimez uniquement les ressources nommées dans les commandes de ce TP.
Conservez Docker pour les TP suivants.
Configuration pour Linux
Linux : exécuter le nettoyage ciblé dans le terminal relié au Docker Engine natif du TP. Ne pas toucher aux ressources d’un autre contexte.
Nettoyage ciblé et reprise
Commandes selon votre OS
docker rm -f asd-tp03-sdk asd-tp03-runtime asd-tp03-correction
docker image rm asd-tp03-sdk:1.0
# Conserver asd-todo:1.0 pour les TP suivants.Vos fichiers restent dans ~/devops-formation/tp-05-03.
Supprimez uniquement les ressources nommées dans les commandes de ce TP.
Conservez Docker pour les TP suivants.
Prérequis
Configuration pour Windows
Conserver Docker Desktop et les dossiers de travail Windows pour les TP suivants. Sauvegarder vos travaux avant tout retrait facultatif.
Conserver le moteur Docker pour la suite.
Guide : Préparer Docker pour les TP
Fermer Terminal Windows lorsque les commandes sont terminées. Docker Desktop reste disponible pour les autres TP.
Configuration pour Linux
Conserver student, devops et l’environnement pour les TP suivants. Le retrait complet reste facultatif, après nettoyage des dépendances et sauvegarde des travaux.
Guide : Préparer Linux pour les TP
Conserver le moteur Docker pour la suite.
Guide : Préparer Docker pour les TP
exit quitte la session student et revient au compte initial si vous avez utilisé su - student. Le système Linux du poste reste installé.