Docker avancé : des images légères
Construire en plusieurs étapes, choisir une image de base minimale, ordonner les couches pour profiter du cache, exclure ce qui n'a rien à faire dans l'image, tirer par empreinte et pousser sur un registre privé.
- 28 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Construction en plusieurs étapes : de quoi s'agit-il ?
Voir la réponse
Dockerfile à plusieurs instructions FROM : une étape compile avec tous ses outils, l'étape finale ne reprend que le résultat par COPY --from.
Seule la dernière étape devient l'image livrée. Le compilateur, les sources et les caches des étapes précédentes n'y figurent pas : pour un binaire Go, l'image passe de plusieurs centaines de Mo à quelques Mo.
Ce Dockerfile est construit une première fois. Tu modifies ensuite uniquement
server.jset tu relancesdocker build. Quelles instructions sont refaites ?
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["node", "server.js"]`COPY . .seulement :npm cireste en cache- Toutes, de
FROMàCMD, comme à la première construction RUN npm cietCOPY . ., car l'installation lit aussiserver.js- Aucune :
server.jsn'est pas listé dans une instructionCOPY
Voir la réponse
COPY . .seulement :npm cireste en cacheLe cache s'invalide à partir de la première instruction dont les entrées changent. La copie des seuls fichiers de dépendances précède l'installation : tant qu'ils sont intacts,
npm ciest réutilisé.COPY . .voitserver.jschanger, et c'est la dernière couche refaite (CMDn'est qu'une métadonnée).Dans un Dockerfile en plusieurs étapes, on nomme l'étape de compilation avec … et on en récupère un fichier dans l'étape finale avec ….
Voir la réponse
Dans un Dockerfile en plusieurs étapes, on nomme l'étape de compilation avec FROM golang:1.22 AS build et on en récupère un fichier dans l'étape finale avec COPY --from=build.
AS builddonne un nom à l'étape ;--from=buildcopie depuis le système de fichiers de cette étape plutôt que depuis le contexte de construction.Image de base : de quoi s'agit-il ?
Voir la réponse
Image désignée par FROM, sur laquelle toutes les couches d'un Dockerfile s'empilent ; elle fixe le système, les outils et une grande partie du poids.
Plus elle contient d'outils (shell, gestionnaire de paquets), plus l'image est lourde et plus il y a de choses à mettre à jour ou à exploiter. Variantes courantes : complète, slim, alpine, distroless, scratch.
Une API Node de 40 Mo de code sort en image de 1,1 Go, construite sur
node:20avec ses outils de compilation. Quelle amélioration réduit le plus la taille sans changer l'application ?- Enchaîner tous les
RUNen un seul pour réduire le nombre de couches - Compresser l'image avec
gzipavant de la pousser - Passer à la base
latest, qui est plus récente donc plus petite - Une construction en plusieurs étapes dont l'étape finale part d'une base alpine ou slim
Voir la réponse
Une construction en plusieurs étapes dont l'étape finale part d'une base alpine ou slim
Le poids vient surtout de la base et des outils de construction : l'étape finale ne garde que le code et ses dépendances d'exécution, sur une base minimale. Fusionner des
RUNn'enlève pas les outils, et les images sont déjà compressées à l'envoi.- Enchaîner tous les