Docker Compose vous permet de gérer plusieurs conteneurs Docker et leurs ressources associées telles que les volumes et les réseaux. Vous écrivez des fichiers YAML déclaratifs que Compose utilise pour créer votre pile de conteneurs.
Votre docker-compose.yml
les fichiers peuvent devenir répétitifs lorsque vous travaillez avec une pile complexe. Les services peuvent partager des options de configuration, ce qui vous oblige à dupliquer des sections de votre fichier. Les mises à jour ultérieures peuvent entraîner des erreurs si vous oubliez de mettre à jour chaque instance d'une section.
Étant donné que les fichiers Compose sont des fichiers YAML simples, vous pouvez tirer parti des fonctionnalités YAML intégrées pour modulariser vos définitions de pile. Les ancres, les alias et les extensions vous permettent d'abstraire les sections YAML en blocs réutilisables. Vous pouvez ajouter une référence à la section à chaque endroit nécessaire.
Qu'est-ce qu'une ancre ?
Les ancres YAML sont une fonctionnalité qui vous permet d'identifier un élément, puis de le référencer ailleurs dans votre fichier. Les ancres sont créées à l'aide de &
signe. Le signe est suivi d'un nom d'alias. Vous pouvez utiliser cet alias ultérieurement pour référencer la valeur suivant l'ancre.
Voici comment vous pouvez utiliser une ancre pour éviter de répéter les règles de redémarrage du conteneur :
services: httpd: image: httpd:latest restart: &restartpolicy unless-stopped mysql: image: mysql:latest restart: *restartpolicy
L'ancre est référencée à l'aide du *
personnage et son alias. Vous devez vous assurer qu'il n'y a pas d'espace entre le &
/*
caractères et le nom d'alias suivant.
Cet exemple montre comment une valeur sur une seule ligne peut être réutilisée avec des ancres. La modification de la politique de redémarrage de la pile peut désormais être effectuée en un seul endroit, sans modifier les services individuellement.
Ancres multilignes
Les ancres peuvent avoir des valeurs multilignes. Vous les créez en utilisant la même syntaxe qu'une ancre à une seule ligne. Ceci est utile lorsque vous devez fournir un ensemble de détails de configuration à plusieurs services.
services: first: image: my-image:latest environment: &env - CONFIG_KEY - EXAMPLE_KEY - DEMO_VAR second: image: another-image:latest environment: *env
Le second
service va maintenant extraire les mêmes variables d'environnement que first
. Nous n'avons pas eu à répéter la liste des variables d'environnement, ce qui la rend beaucoup plus facile à gérer à l'avenir.
Étendre les valeurs d'ancrage
L'exemple d'environnement ci-dessus prend la valeur de l'ancre et l'utilise telle quelle. Vous souhaiterez souvent étendre l'ancre pour ajouter des valeurs supplémentaires. Vous pouvez le faire avec une syntaxe alternative.
Modifier le second
service comme suit :
services: second: image: another-image:latest environment: <<: *env - AN_EXTRA_KEY - SECOND_SPECIFIC_KEY
Le service récupère maintenant la configuration de l'environnement de base à partir de env
ancre. Des clés supplémentaires sont ensuite ajoutées à la liste des environnements. Vous pouvez également remplacer les clés existantes définies par l'ancre.
Utilisation des champs d'extension
Une autre approche de la modularisation est les champs d'extension. Ce sont des fragments YAML spéciaux de haut niveau qui seront ignorés par Docker.
Docker essaie généralement d'interpréter n'importe quel nœud à la racine d'un fichier Compose. L'analyseur ignorera les champs d'extension préfixés par x-
. Vous pouvez utiliser ces champs pour encapsuler la configuration partagée pour référence ultérieure. Combinez les champs d'extension avec des ancres pour extraire des sections de vos définitions de service.
x-env: &env environment: - CONFIG_KEY - EXAMPLE_KEY services: first: <<: *env image: my-image:latest second: <<: *env image: another-image:latest
Ce fichier Compose est un raffinement supplémentaire par rapport à l'exemple ci-dessus. Les variables d'environnement n'appartiennent plus à aucun des services. Ils ont été complètement retirés, dans le x-env
champ d'extension.
Ceci définit un nouveau nœud qui contient l'environment
domaine. Une ancre YAML est utilisée (&env
) afin que les deux services puissent référencer la valeur du champ d'extension.
Composabilité
L'utilisation de ces fonctionnalités vous permet de diviser vos fichiers Compose en morceaux autonomes. Cela vous permet d'éviter des définitions de service trop répétitives. Tout élément commun à plusieurs services doit être placé dans un champ d'extension.
En plus d'aider à la maintenabilité, cette pratique communique vos intentions à d'autres collaborateurs. Il est clair que tous les champs d'extension de niveau supérieur contiennent des champs génériques. Ils ne sont liés à aucun service particulier et peuvent être librement réutilisés.
Les ancres et les champs d'extension vous permettent de composer vos définitions de service à partir de blocs réutilisables de YAML. En gardant chaque champ petit, vos services peuvent mélanger et faire correspondre les sections de configuration des ancres disponibles. La maintenance de vos fichiers Compose devrait devenir moins une corvée.
Autres approches de la modularité
Outre les ancres et les extensions, n'oubliez pas que vous pouvez toujours diviser vos définitions Compose en plusieurs fichiers Compose. Cela peut devenir nécessaire lorsque vous disposez de plusieurs services individuels.
L'utilisation de plusieurs fichiers Compose vous permet d'attribuer à chaque service son propre fichier. Vous pouvez également créer des fichiers de remplacement, où les valeurs d'un nœud sont remplacées ou étendues. Compose fusionnera tous les fichiers pour créer la configuration d'exécution finale.
service.yml
services: service: image: my-image:latest
service-dev.yml
services: service: environment: - DEV_MODE=true
Dans cet exemple, l'application des deux fichiers Compose se traduirait par un service, my-image:latest
, avec le DEV_MODE
ensemble de variables d'environnement. Pour utiliser plusieurs fichiers avec la CLI Compose, passez le -f
drapeau :
docker-compose -f service.yml -f service-dev.yml up -d
Les fichiers sont fusionnés dans l'ordre spécifié.
Résumé
Les fichiers Docker Compose peuvent devenir lourds et répétitifs. Si vous passez du temps à copier des valeurs, pensez à résumer les sections de vos services dans des blocs YAML dédiés.
Des fonctionnalités telles que les ancres et les extensions facilitent la maintenabilité et facilitent l'expérience de création. Tous les fichiers Compose n'en bénéficieront pas ; certains services peuvent avoir peu de choses en commun les uns avec les autres. Évaluez donc votre pile spécifique avant de commencer.