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: value2services:
foo:
key2: VALUE
key3: value3Da como resultado un modelo de aplicación de Compose equivalente al árbol YAML:
services:
foo:
key1: value1
key2: VALUE
key3: value3Secuencia (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.1services:
foo:
DNS:
- 8.8.8.8Da como resultado un modelo de aplicación de Compose equivalente al árbol YAML:
services:
foo:
DNS:
- 1.1.1.1
- 8.8.8.8Excepciones
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:
| Atributo | Clave única |
|---|---|
| volumes | target |
| secrets | target |
| configs | target |
| 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:/workservices:
foo:
volumes:
- bar:/workDa como resultado un modelo de aplicación de Compose equivalente al árbol YAML:
services:
foo:
volumes:
- bar:/workRestablecer 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: BARAnd a compose.override.yaml file:
services:
app:
image: myapp
ports: !reset []
environment:
FOO: !reset nullDa como resultado:
services:
app:
image: myappReemplazar valor (Replace value)
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.