Builders Academy
Docker — Conteneurisation des Applications
2 of 3

Chapitre 1 · Leçon 2

Dockerfile optimisé

Layers, cache et multi-stage builds

Section 1

Dockerfile pour Node.js

Step 1

Dockerfile de base vs optimisé

L'ordre des instructions dans un Dockerfile impacte le cache des layers. Les couches qui changent rarement doivent être en haut.

Dockerfile

dockerfile
1# ❌ Dockerfile naïf — cache invalidé à chaque changement de code
2FROM node:20
3COPY . .                # invalide le cache à chaque modification
4RUN npm install         # réinstalle TOUT à chaque build
5CMD ["node", "dist/index.js"]
6
7# ✅ Dockerfile optimisé — exploite le cache des layers
8FROM node:20-alpine AS base
9
10# Layer 1 : métadonnées du projet (change rarement)
11WORKDIR /app
12
13# Layer 2 : dépendances (change seulement si package.json change)
14COPY package.json pnpm-lock.yaml ./
15RUN corepack enable && pnpm install --frozen-lockfile
16
17# Layer 3 : code source (change souvent, mais le cache des dépendances est préservé)
18COPY . .
19RUN pnpm build
20
21# Exposition du port
22EXPOSE 3000
23
24# Utiliser un utilisateur non-root pour la sécurité
25USER node
26
27CMD ["node", "dist/index.js"]

Step 2

Multi-stage build — images légères

Le multi-stage build permet d'utiliser plusieurs images intermédiaires dans un seul Dockerfile. Résultat : une image finale qui ne contient que le nécessaire pour la production.

Dockerfile

dockerfile
1# ❌ Dockerfile naïf — cache invalidé à chaque changement de code
2FROM node:20
3COPY . .                # invalide le cache à chaque modification
4RUN npm install         # réinstalle TOUT à chaque build
5CMD ["node", "dist/index.js"]
6
7# ✅ Dockerfile optimisé — exploite le cache des layers
8FROM node:20-alpine AS base
9
10# Layer 1 : métadonnées du projet (change rarement)
11WORKDIR /app
12
13# Layer 2 : dépendances (change seulement si package.json change)
14COPY package.json pnpm-lock.yaml ./
15RUN corepack enable && pnpm install --frozen-lockfile
16
17# Layer 3 : code source (change souvent, mais le cache des dépendances est préservé)
18COPY . .
19RUN pnpm build
20
21# Exposition du port
22EXPOSE 3000
23
24# Utiliser un utilisateur non-root pour la sécurité
25USER node
26
27CMD ["node", "dist/index.js"]

Topics and skills covered

  • Docker
  • Dockerfile
  • Multi-stage
  • Cache layers