Qu'est-ce qu'un Dockerfile et pourquoi l'optimiser ?
Un Dockerfile est un fichier texte contenant les instructions pour construire une image Docker. Chaque instruction (FROM, RUN, COPY) crée une couche dans l'image. Un Dockerfile mal optimisé produit des images volumineuses, lentes à construire et à télécharger. Les bonnes pratiques incluent l'utilisation d'images Alpine légères, les builds multi-étapes pour séparer la compilation du runtime, la minimisation des couches et l'ordre des instructions pour maximiser le cache Docker.
Le build multi-étapes (multi-stage)
Le build multi-étapes utilise plusieurs instructions FROM dans un seul Dockerfile. La première étape (builder) contient tous les outils de compilation et produit l'artefact final. La seconde étape copie uniquement cet artefact dans une image minimale. Pour Go, cela permet de passer d'une image de 1 Go (SDK complet) à moins de 20 Mo (binaire statique sur Alpine). Pour Node.js, on exclut les devDependencies. C'est la technique la plus efficace pour réduire la taille des images en production.
L'importance du .dockerignore
Le fichier .dockerignore fonctionne comme .gitignore : il exclut des fichiers du contexte de build Docker. Sans lui, Docker copie tout le répertoire (y compris node_modules, .git, .env) dans le contexte, ce qui ralentit le build et peut inclure des fichiers sensibles dans l'image. Un bon .dockerignore exclut les dépendances locales, les fichiers de version control, les variables d'environnement, la documentation et les fichiers de configuration IDE.