mirror of https://github.com/docker/docs.git
225 lines
4.7 KiB
Markdown
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)
|
|
|