# 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:

```yaml
services:
  foo:
    key1: value1
    key2: value2
```

```yaml
services:
  foo:
    key2: VALUE
    key3: value3
```

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

```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:

```yaml
services:
  foo:
    DNS:
      - 1.1.1.1
```

```yaml
services:
  foo:
    DNS:
      - 8.8.8.8
```

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

```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](/reference/compose-file/merge/services/#command), [entrypoint](/reference/compose-file/merge/services/#entrypoint) y [healthcheck: `test`](/reference/compose-file/merge/services/#healthcheck), 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:

```yaml
services:
  foo:
    command: ["echo", "foo"]
```

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

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

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

### Recursos únicos

Se aplica a los atributos de servicios [ports](/reference/compose-file/merge/services/#ports), [volumes](/reference/compose-file/merge/services/#volumes), [secrets](/reference/compose-file/merge/services/#secrets) y [configs](/reference/compose-file/merge/services/#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:

```yaml
services:
  foo:
    volumes:
      - foo:/work
```

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

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

```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`:

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

And a `compose.override.yaml` file:

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

Da como resultado:

```yaml
services:
  app:
    image: myapp
```

### Reemplazar 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`:

```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:

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

Esto da como resultado:

```yaml
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](#secuencia).

## 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](/compose/how-tos/multiple-compose-files/).


