1. Anatomie d’un Dockerfile et mécanisme de cache par couche

Chaque directive d’un Dockerfile crée une couche (layer) immuable dans le système de fichiers en superposition (OverlayFS). L’ordre des instructions est crucial : placez toujours les fichiers variant rarement (dépendances externes) avant le code source applicatif pour tirer parti du Layer Caching :

# Mauvaise pratique : Invalide le cache de npm install à chaque retouche de code
COPY . .
RUN npm install

# Bonne pratique : Réutilise le cache tant que package.json reste inchangé
COPY package*.json ./
RUN npm install
COPY . .

2. La technique industrielle du Multi-Stage Build

Le Multi-Stage Build sépare hermétiquement l’environnement lourd de compilation (contenant SDKs, compilateurs C/Go/Rust, outils de test) de l’image de livraison finale, qui ne contient que le binaire exécutable pur :

# ÉTAPE 1 : Environnement de compilation lourd
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/api-serveur .

# ÉTAPE 2 : Image d'exécution finale ultra-légère et sécurisée
FROM scratch
WORKDIR /
COPY --from=builder /app/api-serveur /api-serveur
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

# Exécution sous utilisateur non-root non privilégié
USER 10001:10001
EXPOSE 8080

ENTRYPOINT ["/api-serveur"]

Résultat : La taille de l’image passe de 850 Mo à seulement 15 Mo, éliminant par la même occasion 98% des vulnérabilités potentielles de paquets système non requis.

3. Bonnes pratiques de sécurité des conteneurs

  • Ne jamais exécuter en root : Utilisez la directive USER nonroot ou USER 1000.
  • Fichier .dockerignore : Excluez impérativement les répertoires .git/, node_modules/, les fichiers .env et les clés de chiffrement privées.
  • Scan automatique des vulnérabilités : Analysez systématiquement vos images avec des scanners statiques :
# Scan de sécurité de l'image locale avec Trivy
trivy image --severity HIGH,CRITICAL educasuisse/api-service:latest

Système de fichiers en lecture seule : En production, démarrez vos conteneurs avec l’option --read-only pour empêcher tout attaquant d’écrire un exécutable malveillant dans le conteneur compromis.