Docker volumes
Syntaxe
exemple `compose.yml`
services:
# declaration a
volumes:
- nodeModule:/var/www/node_modules
- vendor:/var/www/vendor
- var:/var/www/var
# declaration b
volumes:
vendor:
var:
nodeModule:
Cette syntaxe concerne la gestion des volumes nommés dans Docker. Voici ce qu’il faut comprendre :
Intérêt de cette syntaxe (volumes nommés) :
- Persistance des données : Les volumes nommés (
vendor,var,nodeModule) permettent de conserver les données même après la suppression du conteneur. - Partage entre conteneurs : Ces volumes peuvent être partagés entre plusieurs services (utile par exemple pour partager des dépendances comme
node_modulesouvendorentre plusieurs conteneurs). - Performances : Sur certains systèmes (comme macOS/Windows avec Docker Desktop), monter des volumes pour des dossiers comme
node_modulesouvendoraméliore les performances (évite les problèmes de synchronisation de fichiers avec les mounts bind classiques).
Que se passe-t-il si vous supprimez la partie sous # declaration b ?
- Les volumes nommés ne seront pas créés : Docker essaiera de monter les volumes (
nodeModule,vendor,var), mais comme ils ne sont pas déclarés dans la sectionvolumes:racine, Docker les traitera comme des montages anonymes (volumes temporaires avec un nom généré aléatoirement). - Comportement différent au redémarrage :
- Avec la déclaration : Les données persistent et sont réutilisées.
- Sans la déclaration : Un nouveau volume anonyme est créé à chaque démarrage, et les données précédentes sont perdues (sauf si Docker réutilise un volume anonyme existant, mais ce n’est pas garanti).
Exemple concret :
Si vous avez ceci :
services:
app:
volumes:
- nodeModule:/var/www/node_modules
# Sans cette partie :
# volumes:
# nodeModule:
- Au premier
docker-compose up, Docker créera un volume anonyme pournodeModule. - Si vous supprimez le conteneur et relancez, un nouveau volume anonyme sera créé, et vos
node_modulesprécédents seront perdus.
Conclusion :
La section volumes: racine est nécessaire si vous voulez : - Des volumes persistants et réutilisables. - Pouvoir gérer ces volumes via docker volume ls / docker volume inspect. - Éviter la duplication de données ou les pertes entre les redémarrages.
Vous pouvez aussi utiliser des montages bind (chemins absolus) si vous n’avez pas besoin de volumes Docker managés :
services:
app:
volumes:
- ./node_modules:/var/www/node_modules # Montage bind (dossier local)
Mais cela peut causer des problèmes de performances/permissions dans certains cas.