---
title: Compose Deploy Specification
description: Learn about the Compose Deploy Specification
keywords: compose, compose specification, compose file reference, compose deploy specification
aliases:
- /compose/compose-file/deploy/
weight: 140
---
{{% include "compose/deploy.md" %}}
## Attributes
### `endpoint_mode`
`endpoint_mode` specifies a service discovery method for external clients connecting to a service. The Compose Deploy Specification defines two canonical values:
* `endpoint_mode: vip`: Assigns the service a virtual IP (VIP) that acts as the front end for clients to reach the service
on a network. Platform routes requests between the client and nodes running the service, without client knowledge of how
many nodes are participating in the service or their IP addresses or ports.
* `endpoint_mode: dnsrr`: Platform sets up DNS entries for the service such that a DNS query for the service name returns a
list of IP addresses (DNS round-robin), and the client connects directly to one of these.
```yml
services:
frontend:
image: example/webapp
ports:
- "8080:80"
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
```
### `labels`
`labels` specifies metadata for the service. These labels are only set on the service and not on any containers for the service.
This assumes the platform has some native concept of "service" that can match the Compose application model.
```yml
services:
frontend:
image: example/webapp
deploy:
labels:
com.example.description: "This label will appear on the web service"
```
### `mode`
`mode` defines the replication model used to run a service or job. Options include:
- `global`: Ensures exactly one task continuously runs per physical node until stopped.
- `replicated`: Continuously runs a specified number of tasks across nodes until stopped (default).
- `replicated-job`: Executes a defined number of tasks until a completion state (exits with code 0)'.
- Total tasks are determined by `replicas`.
- Concurrency can be limited using the `max-concurrent` option (CLI only).
- `global-job`: Executes one task per physical node with a completion state (exits with code 0).
- Automatically runs on new nodes as they are added.
```yml
services:
frontend:
image: example/webapp
deploy:
mode: global
batch-job:
image: example/processor
deploy:
mode: replicated-job
replicas: 5
maintenance:
image: example/updater
deploy:
mode: global-job
```
> [!NOTE]
> - Job modes (`replicated-job` and `global-job`) are designed for tasks that complete and exit with code 0.
> - Completed tasks remain until explicitly removed.
> - Options like `max-concurrent` for controlling concurrency are supported only via the CLI and are not available in Compose.
For more detailed information about job options and behavior, see the [Docker CLI documentation](/reference/cli/docker/service/create.md#running-as-a-job)
### `placement`
`placement` specifies constraints and preferences for the platform to select a physical node to run service containers.
#### `constraints`
`constraints` defines a required property the platform's node must fulfill to run the service container. For a further example, see the [CLI reference docs](/reference/cli/docker/service/create.md#constraint).
```yml
deploy:
placement:
constraints:
- disktype=ssd
```
#### `preferences`
`preferences` defines a strategy (currently `spread` is the only supported strategy) to spread tasks evenly
over the values of the datacenter node label. For a further example, see the [CLI reference docs](/reference/cli/docker/service/create.md#placement-pref)
```yml
deploy:
placement:
preferences:
- spread: node.labels.zone
```
### `replicas`
If the service is `replicated` (which is the default), `replicas` specifies the number of containers that should be
running at any given time.
```yml
services:
frontend: