⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Fusion

Compose vous permet de définir un modèle d'application Compose via plusieurs fichiers Compose. Ce faisant, Compose suit certaines règles pour fusionner les fichiers Compose.

Ces règles sont décrites ci-dessous.

Mappage

Un mappage YAML est fusionné en ajoutant les entrées manquantes et en fusionnant celles en conflit.

Fusion des arbres YAML d'exemple suivants :

services:
  foo:
    key1: value1
    key2: value2
services:
  foo:
    key2: VALUE
    key3: value3

Résulte en un modèle d'application Compose équivalent à l'arbre YAML :

services:
  foo:
    key1: value1
    key2: VALUE
    key3: value3

Séquence

Une séquence YAML est fusionnée en ajoutant les valeurs du fichier Compose de remplacement au précédent.

Fusion des arbres YAML d'exemple suivants :

services:
  foo:
    DNS:
      - 1.1.1.1
services:
  foo:
    DNS: 
      - 8.8.8.8

Résulte en un modèle d'application Compose équivalent à l'arbre YAML :

services:
  foo:
    DNS:
      - 1.1.1.1
      - 8.8.8.8

Exceptions

Commandes shell

Lors de la fusion de fichiers Compose qui utilisent les attributs de services command, entrypoint et healthcheck: test, la valeur est remplacée par le dernier fichier Compose, et non ajoutée.

Fusion des arbres YAML d'exemple suivants :

services:
  foo:
    command: ["echo", "foo"]
services:
  foo:
    command: ["echo", "bar"]

Résulte en un modèle d'application Compose équivalent à l'arbre YAML :

services:
  foo:
    command: ["echo", "bar"]

Ressources uniques

S'applique aux attributs de services ports, volumes, secrets et configs. Bien que ces types soient modélisés dans un fichier Compose comme une séquence, ils ont des exigences d'unicité spéciales :

Attribut Clé unique
volumes target
secrets target
configs target
ports {ip, target, published, protocol}

Lors de la fusion de fichiers Compose, Compose ajoute de nouvelles entrées qui ne violent pas une contrainte d'unicité et fusionne les entrées qui partagent une clé unique.

Fusion des arbres YAML d'exemple suivants :

services:
  foo:
    volumes:
      - foo:/work
services:
  foo:
    volumes:
      - bar:/work

Résulte en un modèle d'application Compose équivalent à l'arbre YAML :

services:
  foo:
    volumes:
      - bar:/work

Réinitialiser la valeur

En plus du mécanisme précédemment décrit, un fichier Compose de remplacement peut aussi être utilisé pour supprimer des éléments de votre modèle d'application. À cette fin, l'étiquette YAML personnalisée !reset peut être définie pour remplacer une valeur définie par le fichier Compose remplacé. Une valeur valide pour l'attribut doit être fournie, mais sera ignorée et l'attribut cible sera défini avec la valeur par défaut du type ou null.

Pour la lisibilité, il est recommandé de définir explicitement la valeur de l'attribut à null (null) ou tableau vide [] (avec !reset null ou !reset []) afin qu'il soit clair que l'attribut résultant sera effacé.

Un fichier compose.yaml de base :

services:
  app:
    image: myapp
    ports:
      - "8080:80" 
    environment:
      FOO: BAR           

Et un fichier compose.override.yaml :

services:
  app:
    image: myapp
    ports: !reset []
    environment:
      FOO: !reset null

Résulte en :

services:
  app:
    image: myapp

Remplacer la valeur

Requires: Docker Compose 2.24.4 and later

Tandis que !reset peut être utilisé pour supprimer une déclaration d'un fichier Compose en utilisant un fichier de remplacement, !override vous permet de remplacer complètement un attribut, en contournant les règles de fusion standard. Un exemple typique est de remplacer complètement une définition de ressource, pour s'appuyer sur un modèle distinct mais en utilisant le même nom.

Un fichier compose.yaml de base :

services:
  app:
    image: myapp
    ports:
      - "8080:80"

Pour supprimer le port original, mais exposer un nouveau, le fichier de remplacement suivant est utilisé :

services:
  app:
    ports: !override
      - "8443:443" 

Cela résulte en :

services:
  app:
    image: myapp
    ports:
      - "8443:443" 

Si !override n'avait pas été utilisé, les deux 8080:80 et 8443:443 seraient exposés selon les règles de fusion décrites ci-dessus.

Ressources supplémentaires

Pour plus d'informations sur la façon dont la fusion peut être utilisée pour créer un fichier Compose composite, voir Travailler avec plusieurs fichiers Compose