Unité 4 / 11

Conteneurisation : optimisation de fichiers Docker et d'images avec l'intelligence artificielle

Gains :

  • Capacité à comprendre les concepts de conteneurs et de Dockerfile, les instructions de base et la logique des couches, et à demander à l'intelligence artificielle de produire un Dockerfile prêt pour la production.
  • Possibilité de réduire la taille de l'image et d'augmenter la vitesse et la sécurité du déploiement grâce à une construction en plusieurs étapes et une petite image de base
  • Possibilité d'appliquer les principes de sécurité consistant à ne pas intégrer le secret dans l'image, à l'exécuter avec un utilisateur non autorisé au lieu de root et à analyser l'image

La phrase « Il fonctionnait sur mon ordinateur » est la phrase la plus chère de l'histoire du logiciel. Le même code explose sur un serveur différent en raison d'une version différente de la bibliothèque. La technologie des conteneurs résout exactement ce problème : elle regroupe votre application avec tout ce dont elle a besoin pour s'exécuter (bibliothèques, environnement d'exécution, paramètres) dans un seul package portable. Ce package fonctionne exactement de la même manière partout. L'outil de conteneur le plus courant est Docker.

La description d'un conteneur s'appelle Dockerfile : c'est un fichier texte qui explique dans quel ordre à partir de quelle image de base votre application va démarrer, quels fichiers seront copiés et quelles commandes seront exécutées. Une image est produite à partir de cette recette ; Lorsque l'image est exécutée, elle devient un conteneur. L'IA est très compétente pour écrire un Dockerfile et, plus important encore, pour le réduire et le sécuriser. Mais il est de votre devoir de comprendre ce que fait la recette générée et où elle peut divulguer des secrets.

Instructions de base de Dockerfile

Pour auditer un Dockerfile, vous devez connaître les instructions de base :

  • `FROM` : sélectionne l'image de base (par exemple python:3.12-slim). C’est de là que viennent en grande partie la taille et la sécurité de l’image.
  • `WORKDIR` : Spécifie le répertoire de travail.
  • `COPY` / `ADD` : copie les fichiers dans l'image.
  • `RUN` : exécute une commande pendant la construction (par exemple, installe une dépendance). Chaque RUN crée une nouvelle couche.
  • `ENV` : définit la variable d'environnement.
  • `EXPOSE` : documente le port sur lequel le conteneur écoute.
  • `CMD` / `ENTRYPOINT` : Détermine la commande qui sera exécutée au démarrage du conteneur.

Un concept critique est celui de la couche : Docker met en cache chaque instruction en tant que couche. Si vous placez les étapes qui changent fréquemment à la fin, les couches immuables proviendront du cache et la construction s'accélérera.

Astuce : Les deux principaux leviers pour réduire la taille de l'image sont : (1) choisir une petite image de base telle que mince ou alpine ; (2) utiliser une construction en plusieurs étapes : abandonner les outils de construction à une étape et porter uniquement le produit final sur une image fine. L’IA peut mettre en œuvre ces deux éléments de manière experte quand elle le souhaite.

Pourquoi la petite image est-elle si importante ? Parce que la taille de l’image n’est pas seulement un problème de disque. Une image volumineuse prend plus de temps à extraire à chaque déploiement, occupe plus d'espace dans le registre, ralentit le démarrage des nouveaux pods à mesure qu'elle évolue et, comme elle contient plus de packages, elle offre une plus grande surface d'attaque, c'est-à-dire un espace ouvert qu'un attaquant peut exploiter. Utiliser une image de 100 Mo au lieu d'une image de 1 Go ; Il réduit le temps de déploiement, réduit les coûts et augmente la sécurité. L'optimisation d'un Dockerfile permet de récolter simultanément ces trois avantages. Indiquer explicitement l'objectif de « la plus petite image finale » lorsque vous demandez à l'IA un Dockerfile optimisé ; ainsi, il donne la priorité à la séparation de la phase de compilation et à la suppression des packages inutiles.

Étape par étape : générer et optimiser Dockerfile avec l'IA

  1. Décrivez l'application. Langue, version, commande de saisie, port écouté.
  2. Faites produire la première ébauche. Demandez un Dockerfile simple et fonctionnel.
  3. Optimisez-le. Demandez à la même IA pour la construction en plusieurs étapes, l'image de base mineure et l'optimisation de l'ordre des couches.
  4. Vérifiez la sécurité. Le secret est-il intégré, s'exécute-t-il en tant que root, existe-t-il des outils inutiles ?
  5. Construisez et mesurez la taille. Voir la taille avec les images du docker après la construction du docker.
  6. Balayage. Recherchez les vulnérabilités connues avec un scanner d'exploits comme Docker Scout ou Trivy.

Sécurité : risques spécifiques aux conteneurs

La sécurité des conteneurs est facilement négligée. Trois règles :

  1. N'intégrez pas Secret dans l'image. Des lignes comme ENV API_KEY=... ou COPY .env écrivent en permanence le secret dans les calques de l'image ; Toute personne recevant l’image peut la lire. Donnez le secret au moment de l'exécution en tant que variable d'environnement ou depuis le coffre-fort.
  2. Exécuté en tant que root. Par défaut, les conteneurs s'exécutent en tant que root ; Une ouverture peut se transformer en une sortie du conteneur. Déposez-le à un utilisateur non autorisé avec l'instruction USER.
  3. Image de base petite et à jour. Les images gonflées sont à la fois plus lentes et présentent plus de vulnérabilités. Sélectionnez slim/alpine, corrigez la version (n'utilisez pas :latest).
Attention : même si vous utilisez un secret en RUN puis le supprimez, il reste dans le middleware et peut être relu via l'historique du Docker. Si un secret est requis lors de la construction, utilisez le mécanisme --secret de Docker, et non ENV/COPY.

Tableau d'impact de l'optimisation

technique

Qu'est-ce que

Effet typique

image de base mince/alpine

Supprime les paquets inutiles

900 Mo → 120 Mo

Construction en plusieurs étapes

Exclut les outils de construction

700 Mo → 90 Mo

.dockerignore

N'inclut pas les fichiers inutiles dans la construction

Construction plus rapide, petit contexte

Tri par niveaux

Augmente l'accès au cache

Construire 5 min → 40 sec

Correction de version (:15)

Répétabilité + sécurité

Empêche une détérioration soudaine

trois mini-cases

Cas 1 : image de 1,1 Go réduite à 95 Mo. L'image Node.js d'une équipe faisait 1,1 Go ; Chaque déploiement prenait quelques minutes. Ils ont dit à AI "d'optimiser cela avec une construction en plusieurs étapes et alpine". L'IA a séparé la phase de compilation et a déplacé uniquement les fichiers générés vers l'image fine ; Le résultat était de 95 Mo, le temps de déploiement a été réduit d'un tiers.

Cas 2 : un secret enfoui découvert. Un ingénieur a remarqué la ligne ENV DB_PASSWORD=prod_secret dans le Dockerfile produit par YZ. L'IA avait intégré le mot de passe dans l'image pour que cela « fonctionne ». L'ingénieur l'a supprimé et l'a modifié pour lire le mot de passe à partir de la variable d'environnement au moment de l'exécution. Sinon, toute personne ayant capturé l’image pourrait lire le mot de passe.

Cas 3 — risque de fuite des racines. Un outil d'analyse a signalé que l'image produite par l'IA s'exécutait en tant que root et contenait une vulnérabilité critique. L'équipe a ajouté USER appuser et a poussé l'image de base vers la version actuelle ; numérisation effacée. Leçon : numérisez chaque image avant de la publier et exposez-la à des utilisateurs non autorisés.

Quatre modèles copiables

1) Génération d'un fichier Docker optimisé :

Écrivez un Dockerfile prêt pour la production pour l'application [LANGUE/FRAMEWORK]. Lignes directrices : - Utiliser une construction en plusieurs étapes ; rendre l'image finale la plus petite possible.- L'image de base est mince/alpine et la version est fixe (n'utilisez pas ":latest").- Exécutez le conteneur avec un UTILISATEUR non autorisé, PAS root.- N'intégrez JAMAIS le secret dans l'image ; Attendez la variable d'environnement au moment de l'exécution. - Ajouter la suggestion .dockerignore. Commande d'entrée : [X], port d'écoute : [Y].

2) Optimiser le Dockerfile existant :

Consultez ce Dockerfile pour minimiser et accélérer. Recommander des changements concrets en termes d'ordre des couches, de construction en plusieurs phases, d'image de base et de packages redondants ; Notez l’impact estimé sur la taille et la vitesse de chaque changement. Fichier Docker : [CONTENU]

3) Audit de sécurité :

Vérifiez ce Dockerfile pour la sécurité : y a-t-il des secrets intégrés, des utilisateurs root, des versions non corrigées, des outils inutiles, des images de base obsolètes ? Énumérez les résultats par ordre d’importance et les éventuelles corrections. Fichier Docker : [CONTENU]

4) Résolution des erreurs de construction :

Quelles sont les causes de cette erreur de construction de Docker et comment la résoudre ? Donnez-moi la cause profonde et la solution avec un minimum de changements. Ne produisez pas de valeur réelle là où vous voyez Secret, utilisez un espace réservé. Erreur : [LOG] Fichier Docker : [CONTENT]

Invite faible/Invite forte

Faible : "Écrivez un fichier Docker pour mon application Node."

Résultat : image de base énorme, utilisateur root, étape unique, éventuellement vulnérable au secret ; Une sortie sans considération de taille et de sécurité.

Strong : "Écrivez un Dockerfile prêt pour la production pour mon application Node 20 : construction en plusieurs étapes, image de base node:20-alpine (version corrigée), exécution avec un UTILISATEUR non autorisé, intégration secrète, écoute sur le port 3000, nœud de connexion dist/server.js. Suggérez également .dockerignore."

Différence : la deuxième version d'invite donne la technique d'optimisation, la règle de sécurité et la commande de connexion ; La sortie devient petite, sûre et directement utilisable.

Erreurs courantes

  • Intégration du secret dans l'image avec `ENV`/`COPY`. Il reste dans les couches et est relu.
  • Exécuté en tant que root. Ignorer l'instruction USER constitue un risque sérieux pour la sécurité.
  • En utilisant `:latest`. Cela crée des builds irremplaçables et des perturbations inattendues.
  • Ignorer la construction en plusieurs étapes. Les outils de compilation gonflent inutilement l’image finale.
  • N'écrivez pas « .dockerignore ». D'énormes répertoires tels que .git et node_modules sont inclus dans la version.
  • Publier l'image sans la scanner. Produire des vulnérabilités connues sans s’en rendre compte.

En résumé

Les conteneurs placent l'application dans des packages portables qui fonctionnent de la même manière partout ; la recette est Dockerfile. L'IA est puissante pour produire des Dockerfiles optimisés et prêts pour la production, mais vous devez explicitement exiger des constructions en plusieurs étapes, de petites images de base, aucun utilisateur non autorisé et aucun secret. La réduction de la taille de l'image accélère le déploiement ; Ne pas intégrer le secret, échapper à la racine et analyser l'image garantit la sécurité. Il est de votre responsabilité de vérifier ce que fait chaque recette et où elle fuit.

Tâche de candidature

Choisissez une application simple. Demandez à AI de générer un Dockerfile avec le modèle « Génération Dockerfile optimisée ». Ensuite : (1) Faites vérifier le secret intégré et l'utilisateur root avec le modèle « Contrôle de sécurité » ; (2) si possible, créez Docker et mesurez la taille avec des images Docker ; (3) notez quelle technique sera la plus efficace pour réduire l’image lors de l’étape suivante.

liste de contrôle

  • [ ] J'ai ajouté la version du langage/framework, la commande d'entrée et le port à mon invite.
  • [ ] Il n'y a aucun secret intégré dans le Dockerfile ; attendu au moment de l'exécution secrète.
  • [ ] Le conteneur s'exécute avec un UTILISATEUR non autorisé, pas root.
  • [ ] L'image de base est petite (slim/alpine) et sa version est fixe (no:latest).
  • [ ] J'ai utilisé une construction en plusieurs étapes et .dockerignore.
  • [ ] J'ai scanné l'image avec un scanner de vulnérabilité.