DockerConteneurisationDevOps

Construire des images Docker légères : les bonnes pratiques

5 mai 2026 · Sphinx-Digital

Les images Docker lourdes ralentissent les déploiements, consomment du stockage inutile et augmentent la surface d’attaque. Voici les techniques qui font vraiment la différence.

Le multi-stage build : la technique la plus efficace

Un multi-stage build sépare l’environnement de compilation de l’environnement d’exécution. Le résultat final ne contient que ce qui est nécessaire au runtime.

# Stage de build
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# Stage de production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]

La différence : l’image finale ne contient pas les outils de build, les devDependencies, ou les fichiers source. Gain typique : 60 à 80% de réduction de taille.

Choisir la bonne image de base

Image de baseTaille typiqueUsage recommandé
node:20~1,1 GoDéveloppement local
node:20-slim~250 MoProduction standard
node:20-alpine~60 MoProduction optimisée
distroless/nodejs~120 MoSécurité maximale

Alpine est tentant mais attention : ses bibliothèques C (musl au lieu de glibc) peuvent causer des incompatibilités avec certains packages natifs (bcrypt, sharp…). Testez avant de déployer.

Les erreurs qui font gonfler les images

Installer des outils de debug en production : curl, vim, git n’ont rien à faire dans une image de production. Chaque package installé est une dépendance de plus et une surface d’attaque supplémentaire.

Ne pas nettoyer après les installations :

# Mauvais
RUN apt-get update && apt-get install -y build-essential

# Bon
RUN apt-get update && apt-get install -y build-essential     && rm -rf /var/lib/apt/lists/*

Copier trop tôt les fichiers sources : placez COPY . . le plus tard possible pour maximiser l’utilisation du cache des layers.

Analyser ce qui prend de la place

# Inspecter la composition d'une image
docker history --no-trunc mon-image:latest

# Outil dédié (à installer)
docker run --rm -it wagoodman/dive mon-image:latest

dive est particulièrement utile : il montre couche par couche ce qui est ajouté, modifié ou supprimé, avec un score d’efficacité.

Ces pratiques sont au programme de notre formation Docker.