Ce que vous allez faire
À la fin de ce tutoriel vous disposerez d’un Dockerfile de production qui génère une image de moins de 150 Mo, exécute l’application sous un utilisateur non-root et expose un healthcheck. L’opération complète prend moins de trente minutes sur une machine disposant de Docker.
Prérequis
- Docker 24.0 ou supérieur installé et dans le PATH
- Accès en écriture dans le répertoire du projet
- Application Node.js ou Python prête à être conteneurisée
- Terminal ouvert avec droits utilisateur standard
Étape 1 — Créer le fichier .dockerignore
Le fichier .dockerignore exclut les fichiers inutiles du contexte de build et réduit la taille de l’image finale.
.git
node_modules
.env
*.log
Dockerfile*
docker-compose*.ymlÉtape 2 — Écrire un build multi-étapes
Le build multi-étapes sépare la phase de compilation de l’exécution et produit une image finale contenant uniquement les artefacts nécessaires.
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/main.js"]Étape 3 — Ajouter un utilisateur non-root
L’exécution sous root augmente les risques en cas de compromission du conteneur.
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuserÉtape 4 — Optimiser le cache des couches
Placer les instructions COPY des dépendances avant le code source permet de réutiliser le cache tant que package.json ne change pas.
COPY package*.json ./
RUN npm ci
COPY . .Étape 5 — Ajouter un HEALTHCHECK
Le healthcheck permet à Docker de détecter automatiquement les conteneurs défaillants.
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1Vérifier que tout fonctionne
docker build -t monapp:prod .
docker run --rm -p 3000:3000 monapp:prodLe conteneur répond sur le port 3000 et le healthcheck passe au vert dans docker ps.
Erreurs fréquentes
COPY . . copie tout le contexte y compris node_modules
Ajoutez ou mettez à jour le fichier .dockerignore avant le build.
L’image reste volumineuse malgré le multi-stage
Vérifiez que la seconde étape part bien d’une image minimale (alpine ou distroless) et que seuls les artefacts compilés sont copiés.
HEALTHCHECK échoue en permanence
Assurez-vous que curl est présent dans l’image finale ou remplacez la commande par wget ou node.
Aller plus loin
Intégrez le build dans un pipeline CI/CD, activez la signature des images et configurez Azure Container Registry pour la distribution.
Se former avec Learni
Formation Azure Container Registry : Gestion efficace des images Docker dans le Cloud
Administrateurs cloud et ingénieurs DevOps qui veulent stocker et distribuer des images Docker sur Azure. 3 journées en présentiel, niveau intermédiaire. Lien vers la formation
Formation Azure Container Registry 2026 - Stocker et gérer images Docker
Développeurs et administrateurs systèmes novices souhaitant maîtriser Azure Container Registry. 1 journée en présentiel, niveau novice. Lien vers la formation
Formation Container image scanning 2026 - Sécuriser vos images Docker
Ingénieurs DevOps et responsables sécurité qui veulent détecter les vulnérabilités dans les images. 4 journées en présentiel, niveau novice. Lien vers la formation
FAQ
Quelle commande permet de construire l’image avec le Dockerfile ?
La commande docker build -t monapp:prod . construit l’image en utilisant le Dockerfile présent dans le répertoire courant.
Comment vérifier que l’utilisateur non-root est bien actif ?
Exécutez docker run --rm monapp:prod id pour afficher l’UID et le GID de l’utilisateur dans le conteneur.
Le HEALTHCHECK fonctionne-t-il avec une image alpine ?
Oui, à condition d’installer curl ou d’utiliser wget dans le conteneur final.
Quelle est la différence entre COPY et ADD dans un Dockerfile de production ?
COPY est préféré car il ne décompresse pas automatiquement les archives et reste plus prévisible.
Cet article vous a-t-il été utile ?
Notez-le de 1 à 5 étoiles.
Commentaires
Une question sur cet article, un retour d'expérience ? Lancez la discussion.





