mirror of https://github.com/docker/compose.git
475 lines
17 KiB
Markdown
475 lines
17 KiB
Markdown
There are three legacy versions of the Compose file format:
|
|
|
|
- Version 1. This is specified by omitting a `version` key at the root of the YAML.
|
|
|
|
- Version 2.x. This is specified with a `version: '2'` or `version: '2.1'`, etc., entry at the root of the YAML.
|
|
|
|
- Version 3.x, designed to be cross-compatible between Compose and the Docker Engine's
|
|
[swarm mode](https://docs.docker.com/engine/swarm/). This is specified with a `version: '3'` or `version: '3.1'`, etc., entry at the root of the YAML.
|
|
|
|
The latest and recommended version of the Compose file format is defined by the [Compose Specification](https://docs.docker.com/compose/compose-file/). This format merges the 2.x and 3.x versions and is implemented by **Compose 1.27.0+**.
|
|
|
|
|
|
> **Note**
|
|
>
|
|
> If you're using [multiple Compose files](https://docs.docker.com/compose/multiple-compose-files/) or
|
|
> [extending services](https://docs.docker.com/compose/multiple-compose-files/extends/),
|
|
> each file must be of the same version - you cannot, for example,
|
|
> mix version 1 and 2 in a single project.
|
|
|
|
Several things differ depending on which version you use:
|
|
|
|
- The structure and permitted configuration keys
|
|
- The minimum Docker Engine version you must be running
|
|
- Compose's behaviour with regards to networking
|
|
|
|
These differences are explained below.
|
|
|
|
### Version 2
|
|
|
|
Compose files using the version 2 syntax must indicate the version number at
|
|
the root of the document. All [services](compose-file-v2.md#service-configuration-reference)
|
|
must be declared under the `services` key.
|
|
|
|
Version 2 files are supported by **Compose 1.6.0+** and require a Docker Engine
|
|
of version **1.10.0+**.
|
|
|
|
Named [volumes](compose-file-v2.md#volume-configuration-reference) can be declared under the
|
|
`volumes` key, and [networks](compose-file-v2.md#network-configuration-reference) can be declared
|
|
under the `networks` key.
|
|
|
|
By default, every container joins an application-wide default network, and is
|
|
discoverable at a hostname that's the same as the service name. This means
|
|
[links](compose-file-v2.md#links) are largely unnecessary. For more details, see
|
|
[Networking in Compose](https://docs.docker.com/compose/networking/).
|
|
|
|
> **Note**
|
|
>
|
|
> With Compose version 2, when specifying the Compose file version to use, make sure to
|
|
> specify both the _major_ and _minor_ numbers. If no minor version is given,
|
|
> `0` is used by default and not the latest minor version. As a result, features added in later versions will not be supported. For example:
|
|
>
|
|
> ```yaml
|
|
> version: "2"
|
|
> ```
|
|
>
|
|
> is equivalent to:
|
|
>
|
|
> ```yaml
|
|
> version: "2.0"
|
|
> ```
|
|
|
|
Simple example:
|
|
|
|
version: "{{% param "compose_file_v2" %}}"
|
|
services:
|
|
web:
|
|
build: .
|
|
ports:
|
|
- "8000:5000"
|
|
volumes:
|
|
- .:/code
|
|
redis:
|
|
image: redis
|
|
|
|
A more extended example, defining volumes and networks:
|
|
|
|
version: "{{% param "compose_file_v2" %}}"
|
|
services:
|
|
web:
|
|
build: .
|
|
ports:
|
|
- "8000:5000"
|
|
volumes:
|
|
- .:/code
|
|
networks:
|
|
- front-tier
|
|
- back-tier
|
|
redis:
|
|
image: redis
|
|
volumes:
|
|
- redis-data:/var/lib/redis
|
|
networks:
|
|
- back-tier
|
|
volumes:
|
|
redis-data:
|
|
driver: local
|
|
networks:
|
|
front-tier:
|
|
driver: bridge
|
|
back-tier:
|
|
driver: bridge
|
|
|
|
Several other options were added to support networking, such as:
|
|
|
|
* [`aliases`](compose-file-v2.md#aliases)
|
|
|
|
* The [`depends_on`](compose-file-v2.md#depends_on) option can be used in place of links to indicate dependencies
|
|
between services and startup order.
|
|
|
|
version: "{{% param "compose_file_v2" %}}"
|
|
services:
|
|
web:
|
|
build: .
|
|
depends_on:
|
|
- db
|
|
- redis
|
|
redis:
|
|
image: redis
|
|
db:
|
|
image: postgres
|
|
|
|
* [`ipv4_address`, `ipv6_address`](compose-file-v2.md#ipv4_address-ipv6_address)
|
|
|
|
[Variable substitution](compose-file-v2.md#variable-substitution) also was added in Version 2.
|
|
|
|
### Version 2.1
|
|
|
|
An upgrade of [version 2](#version-2) that introduces new parameters only
|
|
available with Docker Engine version **1.12.0+**. Version 2.1 files are
|
|
supported by **Compose 1.9.0+**.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`link_local_ips`](compose-file-v2.md#link_local_ips)
|
|
- [`isolation`](compose-file-v2.md#isolation-1) in build configurations and
|
|
service definitions
|
|
- `labels` for [volumes](compose-file-v2.md#volume-configuration-reference),
|
|
[networks](compose-file-v2.md#network-configuration-reference), and
|
|
[build](compose-file-v3.md#build)
|
|
- `name` for [volumes](compose-file-v2.md#volume-configuration-reference)
|
|
- [`userns_mode`](compose-file-v2.md#userns_mode)
|
|
- [`healthcheck`](compose-file-v2.md#healthcheck)
|
|
- [`sysctls`](compose-file-v2.md#sysctls)
|
|
- [`pids_limit`](compose-file-v2.md#pids_limit)
|
|
- [`oom_kill_disable`](compose-file-v2.md#cpu-and-other-resources)
|
|
- [`cpu_period`](compose-file-v2.md#cpu-and-other-resources)
|
|
|
|
### Version 2.2
|
|
|
|
An upgrade of [version 2.1](#version-21) that introduces new parameters only
|
|
available with Docker Engine version **1.13.0+**. Version 2.2 files are
|
|
supported by **Compose 1.13.0+**. This version also allows you to specify
|
|
default scale numbers inside the service's configuration.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`init`](compose-file-v2.md#init)
|
|
- [`scale`](compose-file-v2.md#scale)
|
|
- [`cpu_rt_runtime` and `cpu_rt_period`](compose-file-v2.md#cpu_rt_runtime-cpu_rt_period)
|
|
- [`network`](compose-file-v2.md#network) for [build configurations](compose-file-v2.md#build)
|
|
|
|
### Version 2.3
|
|
|
|
An upgrade of [version 2.2](#version-22) that introduces new parameters only
|
|
available with Docker Engine version **17.06.0+**. Version 2.3 files are
|
|
supported by **Compose 1.16.0+**.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`target`](compose-file-v2.md#target), [`extra_hosts`](compose-file-v2.md#extra_hosts-1) and
|
|
[`shm_size`](compose-file-v2.md#shm_size) for [build configurations](compose-file-v2.md#build)
|
|
- `start_period` for [`healthchecks`](compose-file-v2.md#healthcheck)
|
|
- ["Long syntax" for volumes](compose-file-v2.md#long-syntax)
|
|
- [`runtime`](compose-file-v2.md#runtime) for service definitions
|
|
- [`device_cgroup_rules`](compose-file-v2.md#device_cgroup_rules)
|
|
|
|
### Version 2.4
|
|
|
|
An upgrade of [version 2.3](#version-23) that introduces new parameters only
|
|
available with Docker Engine version **17.12.0+**. Version 2.4 files are
|
|
supported by **Compose 1.21.0+**.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`platform`](compose-file-v2.md#platform) for service definitions
|
|
- Support for extension fields at the root of service, network, and volume
|
|
definitions
|
|
|
|
### Version 3
|
|
|
|
Designed to be cross-compatible between Compose and the Docker Engine's
|
|
[swarm mode](/engine/swarm/), version 3 removes several options and adds
|
|
several more.
|
|
|
|
- Removed: `volume_driver`, `volumes_from`, `cpu_shares`, `cpu_quota`,
|
|
`cpuset`, `mem_limit`, `memswap_limit`, `extends`, `group_add`. See
|
|
the [upgrading](#upgrading) guide for how to migrate away from these.
|
|
|
|
- Added: [deploy](compose-file-v3.md#deploy)
|
|
|
|
If only the major version is given (`version: '3'`),
|
|
the latest minor version is used by default.
|
|
|
|
### Version 3.1
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters only
|
|
available with Docker Engine version **1.13.1+**, and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`secrets`](compose-file-v3.md#secrets)
|
|
|
|
### Version 3.2
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters only
|
|
available with Docker Engine version **17.04.0+**, and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`cache_from`](compose-file-v3.md#cache_from) in [build configurations](compose-file-v3.md#build)
|
|
- Long syntax for [ports](compose-file-v3.md#ports) and [volume mounts](compose-file-v3.md#volumes)
|
|
- [`attachable`](compose-file-v3.md#attachable) network driver option
|
|
- [deploy `endpoint_mode`](compose-file-v3.md#endpoint_mode)
|
|
- [deploy placement `preference`](compose-file-v3.md#placement)
|
|
|
|
### Version 3.3
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters only
|
|
available with Docker Engine version **17.06.0+**, and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [build `labels`](compose-file-v3.md#build)
|
|
- [`credential_spec`](compose-file-v3.md#credential_spec)
|
|
- [`configs`](compose-file-v3.md#configs)
|
|
|
|
### Version 3.4
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters. It is
|
|
only available with Docker Engine version **17.09.0** and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`target`](compose-file-v3.md#target) and [`network`](compose-file-v3.md#network) in
|
|
[build configurations](compose-file-v3.md#build)
|
|
- `start_period` for [`healthchecks`](compose-file-v3.md#healthcheck)
|
|
- `order` for [update configurations](compose-file-v3.md#update_config)
|
|
- `name` for [volumes](compose-file-v3.md#volume-configuration-reference)
|
|
|
|
### Version 3.5
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters. It is
|
|
only available with Docker Engine version **17.12.0** and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`isolation`](compose-file-v3.md#isolation) in service definitions
|
|
- `name` for networks, secrets and configs
|
|
- `shm_size` in [build configurations](compose-file-v3.md#build)
|
|
|
|
### Version 3.6
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters. It is
|
|
only available with Docker Engine version **18.02.0** and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`tmpfs` size](compose-file-v3.md#long-syntax-3) for `tmpfs`-type mounts
|
|
|
|
### Version 3.7
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters. It is
|
|
only available with Docker Engine version **18.06.0** and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`init`](compose-file-v3.md#init) in service definitions
|
|
- [`rollback_config`](compose-file-v3.md#rollback_config) in deploy configurations
|
|
- Support for extension fields at the root of service, network, volume, secret
|
|
and config definitions
|
|
|
|
### Version 3.8
|
|
|
|
An upgrade of [version 3](#version-3) that introduces new parameters. It is
|
|
only available with Docker Engine version **19.03.0** and higher.
|
|
|
|
Introduces the following additional parameters:
|
|
|
|
- [`max_replicas_per_node`](compose-file-v3.md#max_replicas_per_node) in placement
|
|
configurations
|
|
- `template_driver` option for [config](compose-file-v3.md#configs-configuration-reference)
|
|
and [secret](compose-file-v3.md#secrets-configuration-reference) configurations. This
|
|
option is only supported when deploying swarm services using
|
|
`docker stack deploy`.
|
|
- `driver` and `driver_opts` option for [secret](compose-file-v3.md#secrets-configuration-reference)
|
|
configurations. This option is only supported when deploying swarm services
|
|
using `docker stack deploy`.
|
|
|
|
### Version 1 (Deprecated)
|
|
|
|
Compose versions below 1.6.x are
|
|
|
|
Compose files that do not declare a version are considered "version 1". In those
|
|
files, all the [services](compose-file-v3.md#service-configuration-reference) are
|
|
declared at the root of the document.
|
|
|
|
Version 1 is supported by Compose up to 1.6.x** and has been deprecated.
|
|
|
|
Version 1 files cannot declare named
|
|
[volumes](compose-file-v3.md#volume-configuration-reference), [networks](compose-file-v3.md#network-configuration-reference) or
|
|
[build arguments](compose-file-v3.md#args).
|
|
|
|
Compose does not take advantage of [networking](https://docs.docker.com/compose/networking/) when you
|
|
use version 1: every container is placed on the default `bridge` network and is
|
|
reachable from every other container at its IP address. You need to use
|
|
`links` to enable discovery between containers.
|
|
|
|
Example:
|
|
|
|
web:
|
|
build: .
|
|
ports:
|
|
- "8000:5000"
|
|
volumes:
|
|
- .:/code
|
|
links:
|
|
- redis
|
|
redis:
|
|
image: redis
|
|
|
|
## Upgrading
|
|
|
|
### Version 2.x to 3.x
|
|
|
|
Between versions 2.x and 3.x, the structure of the Compose file is the same, but
|
|
several options have been removed:
|
|
|
|
- `volume_driver`: Instead of setting the volume driver on the service, define
|
|
a volume using the
|
|
[top-level `volumes` option](compose-file-v3.md#volume-configuration-reference)
|
|
and specify the driver there.
|
|
|
|
version: "3.8"
|
|
services:
|
|
db:
|
|
image: postgres
|
|
volumes:
|
|
- data:/var/lib/postgresql/data
|
|
volumes:
|
|
data:
|
|
driver: mydriver
|
|
|
|
- `volumes_from`: To share a volume between services, define it using the
|
|
[top-level `volumes` option](compose-file-v3.md#volume-configuration-reference)
|
|
and reference it from each service that shares it using the
|
|
[service-level `volumes` option](compose-file-v3.md#driver).
|
|
|
|
- `cpu_shares`, `cpu_quota`, `cpuset`, `mem_limit`, `memswap_limit`: These
|
|
have been replaced by the [resources](compose-file-v3.md#resources) key under
|
|
`deploy`. `deploy` configuration only takes effect when using
|
|
`docker stack deploy`, and is ignored by `docker-compose`.
|
|
|
|
- `extends`: This option has been removed for `version: "3.x"` Compose files.
|
|
For more information on `extends`, see
|
|
[Extending services](https://docs.docker.com/compose/multiple-compose-files/extends/).
|
|
- `group_add`: This option has been removed for `version: "3.x"` Compose files.
|
|
- `pids_limit`: This option has not been introduced in `version: "3.x"` Compose files.
|
|
- `link_local_ips` in `networks`: This option has not been introduced in
|
|
`version: "3.x"` Compose files.
|
|
|
|
#### Compatibility mode
|
|
|
|
`docker-compose` 1.20.0 introduces a new `--compatibility` flag designed to
|
|
help developers transition to version 3 more easily. When enabled,
|
|
`docker-compose` reads the `deploy` section of each service's definition and
|
|
attempts to translate it into the equivalent version 2 parameter. Currently,
|
|
the following deploy keys are translated:
|
|
|
|
- [resources](compose-file-v3.md#resources) limits and memory reservations
|
|
- [replicas](compose-file-v3.md#replicas)
|
|
- [restart_policy](compose-file-v3.md#restart_policy) `condition` and `max_attempts`
|
|
|
|
All other keys are ignored and produce a warning if present. You can review
|
|
the configuration that will be used to deploy by using the `--compatibility`
|
|
flag with the `config` command.
|
|
|
|
> Do not use this in production
|
|
>
|
|
> We recommend against using `--compatibility` mode in production. The
|
|
> resulting configuration is only an approximate using non-Swarm mode
|
|
> properties, it may produce unexpected results.
|
|
|
|
### Version 1 to 2.x
|
|
|
|
In the majority of cases, moving from version 1 to 2 is a very simple process:
|
|
|
|
1. Indent the whole file by one level and put a `services:` key at the top.
|
|
2. Add a `version: '2'` line at the top of the file.
|
|
|
|
It's more complicated if you're using particular configuration features:
|
|
|
|
- `dockerfile`: This now lives under the `build` key:
|
|
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile-alternate
|
|
|
|
- `log_driver`, `log_opt`: These now live under the `logging` key:
|
|
|
|
logging:
|
|
driver: syslog
|
|
options:
|
|
syslog-address: "tcp://192.168.0.42:123"
|
|
|
|
- `links` with environment variables: environment variables created by
|
|
links, such as `CONTAINERNAME_PORT`, ` have been deprecated for some time. In the new Docker network system,
|
|
they have been removed. You should either connect directly to the
|
|
appropriate hostname or set the relevant environment variable yourself,
|
|
using the link hostname:
|
|
|
|
web:
|
|
links:
|
|
- db
|
|
environment:
|
|
- DB_PORT=tcp://db:5432
|
|
|
|
- `external_links`: Compose uses Docker networks when running version 2
|
|
projects, so links behave slightly differently. In particular, two
|
|
containers must be connected to at least one network in common in order to
|
|
communicate, even if explicitly linked together.
|
|
|
|
Either connect the external container to your app's
|
|
[default network](https://docs.docker.com/compose/networking/), or connect both the external container and
|
|
your service's containers to an
|
|
[external network](https://docs.docker.com/compose/networking/).
|
|
|
|
- `net`: This is now replaced by [network_mode](compose-file-v3.md#network_mode):
|
|
|
|
net: host -> network_mode: host
|
|
net: bridge -> network_mode: bridge
|
|
net: none -> network_mode: none
|
|
|
|
If you're using `net: "container:[service name]"`, you must now use
|
|
`network_mode: "service:[service name]"` instead.
|
|
|
|
net: "container:web" -> network_mode: "service:web"
|
|
|
|
If you're using `net: "container:[container name/id]"`, the value does not
|
|
need to change.
|
|
|
|
net: "container:cont-name" -> network_mode: "container:cont-name"
|
|
net: "container:abc12345" -> network_mode: "container:abc12345"
|
|
|
|
- `volumes` with named volumes: these must now be explicitly declared in a
|
|
top-level `volumes` section of your Compose file. If a service mounts a
|
|
named volume called `data`, you must declare a `data` volume in your
|
|
top-level `volumes` section. The whole file might look like this:
|
|
|
|
version: "{{% param "compose_file_v2" %}}"
|
|
services:
|
|
db:
|
|
image: postgres
|
|
volumes:
|
|
- data:/var/lib/postgresql/data
|
|
volumes:
|
|
data: {}
|
|
|
|
By default, Compose creates a volume whose name is prefixed with your
|
|
project name. If you want it to just be called `data`, declare it as
|
|
external:
|
|
|
|
volumes:
|
|
data:
|
|
external: true
|