Compartir comentarios
Las respuestas se generan en base a la documentación.

Fusionar archivos de Compose

Compose te ayuda a definir un modelo de aplicación de Compose a través de múltiples archivos de Compose. Al hacerlo, Compose sigue ciertas reglas para fusionar los archivos.

Estas reglas se describen a continuación.

Mapeo (Mapping)

Un mapeo (mapping) de YAML se fusiona añadiendo las entradas que faltan y fusionando las que están en conflicto.

La fusión de los siguientes árboles YAML de ejemplo:

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

Da como resultado un modelo de aplicación de Compose equivalente al árbol YAML:

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

Secuencia (Sequence)

Una secuencia (sequence) de YAML se fusiona añadiendo los valores del archivo de Compose que invalida al anterior.

La fusión de los siguientes árboles YAML de ejemplo:

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

Da como resultado un modelo de aplicación de Compose equivalente al árbol YAML:

services:
  foo:
    DNS:
      - 1.1.1.1
      - 8.8.8.8

Excepciones

Comandos de shell

Al fusionar archivos de Compose que utilizan los atributos de servicios command, entrypoint y healthcheck: test, el valor se invalida (override) por el del último archivo de Compose y no se añade.

La fusión de los siguientes árboles YAML de ejemplo:

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

Da como resultado un modelo de aplicación de Compose equivalente al árbol YAML:

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

Recursos únicos

Se aplica a los atributos de servicios ports, volumes, secrets y configs. Aunque estos tipos se modelan en un archivo de Compose como una secuencia, tienen requisitos de unicidad especiales:

AtributoClave única
volumestarget
secretstarget
configstarget
ports{ip, target, published, protocol}

Al fusionar archivos de Compose, Compose añade las nuevas entradas que no violen una restricción de unicidad y fusiona las entradas que comparten una clave única.

La fusión de los siguientes árboles YAML de ejemplo:

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

Da como resultado un modelo de aplicación de Compose equivalente al árbol YAML:

services:
  foo:
    volumes:
      - bar:/work

Restablecer valor (Reset value)

Además del mecanismo descrito anteriormente, se puede utilizar un archivo de Compose de invalidación (override) para eliminar elementos del modelo de tu aplicación. Para ello, se puede establecer la etiqueta personalizada de YAML (YAML tag) !reset para invalidar un valor establecido por el archivo de Compose invalidado. Se debe proporcionar un valor válido para el atributo, pero se ignorará y el atributo de destino se establecerá con el valor predeterminado del tipo o con null.

Para facilitar la lectura, se recomienda establecer explístamente el valor del atributo a null (null) o a un array vacío [] (con !reset null o !reset []) para que quede claro que el atributo resultante se borrará.

Un archivo base compose.yaml:

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

And a compose.override.yaml file:

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

Da como resultado:

services:
  app:
    image: myapp

Reemplazar valor (Replace value)

Requiere: Docker Compose 2.24.4 y posterior

Mientras que !reset se puede utilizar para eliminar una declaración de un archivo de Compose utilizando un archivo de invalidación, !override te permite reemplazar completamente un atributo, omitiendo las reglas de fusión estándar. Un ejemplo típico es reemplazar por completo la definición de un recurso, para basarse en un modelo distinto pero utilizando el mismo nombre.

Un archivo base compose.yaml:

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

Para eliminar el puerto original, pero exponer uno nuevo, se utiliza el siguiente archivo de invalidación:

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

Esto da como resultado:

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

Si no se hubiera utilizado !override, tanto 8080:80 como 8443:443 estarían expuestos de acuerdo con las reglas de fusión descritas anteriormente.

Recursos adicionales

Para obtener más información sobre cómo se puede utilizar la fusión para crear un archivo de Compose compuesto, consulta Trabajar con múltiples archivos de Compose.