Comment simplifier les fichiers Docker Compose avec les ancres et les extensions YAML –
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, vous obligeant à 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.
Les fichiers de composition étant 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 des sections YAML en blocs réutilisables. Vous pouvez ajouter une référence à la section à chaque endroit où vous en avez besoin.
Sommaire
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 du &
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 stratégies de redémarrage des conteneurs:
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 *
caractère 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 sur 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 rendra beaucoup plus maintenable à l’avenir.
Extension des valeurs d’ancrage
L’exemple d’environnement ci-dessus prend la valeur de l’ancre et l’utilise telle quelle. Vous voudrez 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 extrait maintenant la configuration de l’environnement de base à partir du env
ancre. Des clés supplémentaires sont ensuite ajoutées à la liste d’environnement. Vous pouvez également remplacer les clés existantes définies par l’ancre.
Utilisation des champs d’extension
Les champs d’extension constituent une autre approche de la modularisation. Ce sont des fragments YAML spéciaux de premier 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 des champs d’extension avec des ancres pour résumer 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 soulevés, dans le x-env
champ d’extension.
Ceci définit un nouveau nœud qui contient le 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 les définitions de service trop répétitives. Tout ce qui est commun à plus d’un service doit être soulevé 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 composer vos définitions de service à partir de blocs réutilisables de YAML. En gardant chaque champ petit, vos services peuvent mélanger et assortir les sections de configuration à partir 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 plus d’une poignée de services individuels.
L’utilisation de plusieurs fichiers de composition vous permet d’allouer à chaque service son propre fichier. Vous pouvez également créer des fichiers de remplacement, dans lesquels les valeurs d’un nœud sont remplacées ou étendues. Compose fusionnera tous les fichiers ensemble 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 aboutirait à un service, my-image:latest
, avec le DEV_MODE
jeu de variables d’environnement. Pour utiliser plusieurs fichiers avec la CLI Compose, transmettez 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, envisagez de résumer des 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 en commun les uns avec les autres – alors évaluez votre pile spécifique avant de commencer.