
Utiliser le fichier `.dockerignore`
Apprenez comment et pourquoi utiliser un fichier `.dockerignore` pour accélérer vos builds Docker, réduire la taille du contexte et éviter d'inclure des fichiers inutiles ou sensibles.
Maîtriser le contexte de build : le rôle essentiel du `.dockerignore`
Lorsque vous exécutez la commande `docker build`, la première chose que le client Docker fait est de préparer un "contexte de build". Par défaut, ce contexte est l'ensemble des fichiers et répertoires situés à l'emplacement spécifié (souvent `.` pour le répertoire courant). Ce contexte est ensuite envoyé au démon Docker, qui l'utilisera pour exécuter les instructions de votre `Dockerfile`, notamment les commandes `COPY` et `ADD`.
Le fichier `.dockerignore` joue un rôle crucial à cette étape initiale. Similaire dans son fonctionnement et sa syntaxe au fichier `.gitignore` utilisé par Git, il permet de spécifier quels fichiers et répertoires présents dans le chemin du contexte doivent être exclus lors de la création et de l'envoi de ce contexte au démon Docker. Utiliser correctement un fichier `.dockerignore` est une bonne pratique fondamentale pour plusieurs raisons : optimisation des performances, sécurité et propreté des images.
Ignorer ce fichier revient souvent à envoyer une quantité importante de données inutiles au démon Docker, ce qui peut ralentir considérablement le processus de build, surtout si le contexte contient des fichiers volumineux ou si le démon s'exécute sur une machine distante. De plus, cela augmente le risque d'inclure accidentellement des fichiers sensibles ou superflus dans votre image Docker.
Pourquoi exclure des fichiers du contexte de build ?
Plusieurs types de fichiers et répertoires devraient systématiquement être exclus du contexte de build via `.dockerignore` :
1. Fichiers et répertoires spécifiques au contrôle de version : Le répertoire `.git` (et son contenu potentiellement volumineux), ainsi que les fichiers `.gitignore`, `.gitattributes`, etc., ne sont généralement pas nécessaires à l'intérieur de l'image Docker finale.
2. Dépendances locales et artefacts de build : Les répertoires comme `node_modules`, `vendor` (PHP/Composer), `target` (Java/Maven), `build`, `dist`, etc., contiennent souvent des centaines ou des milliers de fichiers. Ces dépendances doivent être installées à l'intérieur de l'image via des instructions `RUN` (ex: `npm install`, `pip install`, `mvn package`) plutôt que copiées depuis l'hôte. Les inclure dans le contexte ralentit le build et peut conduire à des images énormes si copiées accidentellement.
3. Fichiers de configuration de l'IDE et de l'OS : Les répertoires comme `.vscode`, `.idea`, `.project` ou les fichiers comme `.DS_Store` (macOS) sont spécifiques à l'environnement de développement et n'ont rien à faire dans une image Docker.
4. Fichiers de logs et temporaires : Les fichiers `*.log`, `*.tmp`, etc., générés localement pendant le développement.
5. Secrets et fichiers de configuration sensibles : Bien que la gestion des secrets dans Docker nécessite des techniques plus avancées (comme les secrets Docker ou les variables d'environnement), il est absolument crucial d'exclure du contexte tout fichier contenant des mots de passe, des clés d'API ou d'autres informations sensibles (`credentials.json`, `.env` contenant des secrets, clés privées SSH, etc.). Même s'ils ne sont pas explicitement copiés par une instruction `COPY`, leur présence dans le contexte envoyé au démon constitue un risque.
6. Documentation et tests (parfois) : Les fichiers `README.md`, la documentation, les répertoires de tests (`tests/`, `spec/`) peuvent parfois être exclus s'ils ne sont pas strictement nécessaires à l'exécution de l'application dans l'image finale (surtout pour une image de production).
Mise en oeuvre : syntaxe et exemples
Le fichier `.dockerignore` doit être placé à la racine du répertoire qui sert de contexte de build (généralement là où se trouve votre `Dockerfile`). Sa syntaxe est simple et suit les règles de correspondance de motifs de `filepath.Match` en Go, similaires à celles de `.gitignore` :
- Chaque ligne spécifie un motif à exclure.
- Les lignes vides ou commençant par `#` sont ignorées (commentaires).
- Les motifs sont relatifs au chemin du fichier `.dockerignore`.
- L'astérisque `*` sert de joker pour n'importe quelle séquence de caractères (sauf `/`).
- Le double astérisque `**` peut correspondre à n'importe quel nombre de répertoires.
- Un point d'exclamation `!` en début de ligne annule une exclusion précédente (utile pour faire des exceptions).
- Un `/` à la fin d'un motif ne correspond qu'aux répertoires.
Voici un exemple de fichier `.dockerignore` assez complet pour un projet Node.js :
# Fichier .dockerignore pour un projet Node.js
# Gestion de version
.git
.gitignore
# Dépendances et artefacts de build
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*
build/
dist/
# Fichiers système et IDE
.DS_Store
.idea/
.vscode/
*.sublime-workspace
# Fichiers de logs et temporaires
*.log
tmp/
# Fichiers de configuration locaux (si différents en prod)
.env
# Documentation et tests (optionnel)
README.md
docs/
tests/
# Inclure spécifiquement un fichier de conf de prod
# même s'il est dans un répertoire ignoré (exemple)
!config/production.jsonEn utilisant un tel fichier, lorsque vous lancerez `docker build .`, seuls les fichiers sources essentiels (`server.js`, `package.json`, etc.) seront inclus dans le contexte envoyé au démon Docker. Les instructions `COPY . .` dans votre Dockerfile ne copieront alors que ces fichiers pertinents, et non les `node_modules` de votre machine locale ou le répertoire `.git`. Cela se traduit par un envoi de contexte quasi instantané, des builds plus rapides et une réduction significative des risques d'erreurs ou de failles de sécurité liées à l'inclusion de fichiers non désirés.