Images et couches
Ce qu'est vraiment une image, pourquoi l'ordre du Dockerfile compte.
Une image est un modèle en lecture seule. Un conteneur est une instance en cours d'exécution de ce modèle, avec une fine couche inscriptible par-dessus. La même image sert cent conteneurs ; leurs écritures ne se voient pas entre elles, et disparaissent avec eux.
$ docker image inspect --format '{{len .RootFS.Layers}}' nginx:alpine
6Chaque instruction RUN, COPY ou ADD d'un Dockerfile ajoute une couche.
Elles s'empilent et sont mises en cache individuellement.
Pourquoi l'ordre compte
Docker réutilise une couche du cache tant que l'instruction et toutes celles qui la précèdent sont inchangées. Une seule invalidation rejoue tout le reste.
COPY . . # ← le moindre changement de code…
RUN npm ci # ← …refait toute l'installationL'ordre correct isole ce qui change souvent de ce qui change rarement :
COPY package*.json ./ # ne change qu'au changement de dépendances
RUN npm ci # ← cache conservé entre deux commits de code
COPY . .Supprimer un fichier dans une couche ultérieure ne le retire pas de l'image : il reste dans la couche où il a été écrit, simplement masqué. Un secret copié puis « effacé » à l'étape suivante est toujours lisible dans l'historique de l'image. La seule parade est de ne jamais l'y écrire — build multi-étapes ou montage de secret.
Les pièges classiques
Le tag latest n'a aucune signification particulière : c'est un tag comme un
autre, que rien n'oblige à pointer sur la version la plus récente. Il est
surtout mouvant — deux builds à deux jours d'écart ne produisent pas la même
image. En production, on épingle une version, voire un digest sha256:.
docker build sans .dockerignore envoie tout le répertoire au démon, y
compris node_modules et .git. Le build devient lent et l'image grossit sans
raison.
Réponse unique
Un secret est copié dans une couche, puis supprimé par un `RUN rm` à l'étape suivante. Est-il récupérable dans l'image finale ?
Indice · Une couche déjà écrite peut-elle être modifiée par une couche suivante ?
[ METTRE EN PRATIQUE ]
Rendre un build reproductible et rapide
3 étapes · 25 min · 120 XP
[ CETTE LEÇON DANS LES PARCOURS ]