docs/content/reference/compose-file/merge.md

225 lines
4.7 KiB
Markdown

---
title: Merge
description: Learn about merging rules
keywords: compose, compose specification, merge, compose file reference
aliases:
- /compose/compose-file/13-merge/
weight: 100
---
{{% include "compose/merge.md" %}}
These rules are outlined below.
## Mapping
A YAML `mapping` gets merged by adding missing entries and merging the conflicting ones.
Merging the following example YAML trees:
```yaml
services:
foo:
key1: value1
key2: value2
```
```yaml
services:
foo:
key2: VALUE
key3: value3
```
Results in a Compose application model equivalent to the YAML tree:
```yaml
services:
foo:
key1: value1
key2: VALUE
key3: value3
```
## Sequence
A YAML `sequence` is merged by appending values from the overriding Compose file to the previous one.
Merging the following example YAML trees:
```yaml
services:
foo:
DNS:
- 1.1.1.1
```
```yaml
services:
foo:
DNS:
- 8.8.8.8
```
Results in a Compose application model equivalent to the YAML tree:
```yaml
services:
foo:
DNS:
- 1.1.1.1
- 8.8.8.8
```
## Exceptions
### Shell commands
When merging Compose files that use the services attributes [command](services.md#command), [entrypoint](services.md#entrypoint) and [healthcheck: `test`](services.md#healthcheck), the value is overridden by the latest Compose file, and not appended.
Merging the following example YAML trees:
```yaml
services:
foo:
command: ["echo", "foo"]
```
```yaml
services:
foo:
command: ["echo", "bar"]
```
Results in a Compose application model equivalent to the YAML tree:
```yaml
services:
foo:
command: ["echo", "bar"]
```
### Unique resources
Applies to the [ports](services.md#ports), [volumes](services.md#volumes), [secrets](services.md#secrets) and [configs](services.md#configs) services attributes.
While these types are modeled in a Compose file as a sequence, they have special uniqueness requirements:
| Attribute | Unique key |
|-------------|--------------------------|
| volumes | target |
| secrets | target |
| configs | target |
| ports | {ip, target, published, protocol} |
When merging Compose files, Compose appends new entries that do not violate a uniqueness constraint and merge entries that share a unique key.
Merging the following example YAML trees:
```yaml
services:
foo:
volumes:
- foo:/work
```
```yaml
services:
foo:
volumes:
- bar:/work
```
Results in a Compose application model equivalent to the YAML tree:
```yaml
services:
foo:
volumes:
- bar:/work
```
### Reset value
In addition to the previously described mechanism, an override Compose file can also be used to remove elements from your application model.
For this purpose, the custom [YAML tag](https://yaml.org/spec/1.2.2/#24-tags) `!reset` can be set to
override a value set by the overriden Compose file. A valid value for attribute must be provided,
but will be ignored and target attribute will be set with type's default value or `null`.
For readability, it is recommended to explicitly set the attribute value to the null (`null`) or empty
array `[]` (with `!reset null` or `!reset []`) so that it is clear that resulting attribute will be
cleared.
A base `compose.yaml` file:
```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
```
Results in:
```yaml
services:
app:
image: myapp
```
### Replace value
{{< summary-bar feature_name="Compose replace file" >}}
While `!reset` can be used to remove a declaration from a Compose file using an override file, `!override` allows you
to fully replace an attribute, bypassing the standard merge rules. A typical example is to fully replace a resource definition, to rely on a distinct model but using the same name.
A base `compose.yaml` file:
```yaml
services:
app:
image: myapp
ports:
- "8080:80"
```
To remove the original port, but expose a new one, the following override file is used:
```yaml
services:
app:
ports: !override
- "8443:443"
```
This results in:
```yaml
services:
app:
image: myapp
ports:
- "8443:443"
```
If `!override` had not been used, both `8080:80` and `8443:443` would be exposed as per the [merging rules outlined above](#sequence).
## Additional resources
For more information on how merge can be used to create a composite Compose file, see [Working with multiple Compose files](/manuals/compose/how-tos/multiple-compose-files/_index.md)