GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment simplifier les fichiers Docker Compose avec des ancres et des 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, 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.


Docker
  1. Comment déployer et gérer MongoDB avec Docker

  2. Comment installer et héberger un serveur OpenVPN avec Docker

  3. Comment sécuriser les données sensibles avec Docker Compose Secrets

  4. Comment utiliser les profils de service pour simplifier les piles dans Docker Compose

  5. Comment installer et utiliser Docker Compose sur CentOS

Comment installer Docker et Docker Compose sous Linux

Comment déployer des piles Docker Compose sur Kubernetes avec Kompose

Comment trouver des vulnérabilités dans des conteneurs et des fichiers avec Grype

Comment copier des fichiers avec Docker cp dans votre conteneur Docker

Comment exécuter Jenkins dans Docker à l'aide de Docker Compose avec des volumes

Comment copier des fichiers entre l'hôte et le conteneur Docker