Can you define optional docker-compose services?

Docker compose now supports profiles, which allow you to a) disable one or more services by default, and b) enable them when docker compose is ran with the corresponding --profile argument.

This is done by adding a profiles key to your service in the docker-compose.yml file. Services that have don't have this key are always started by docker-compose (for all profiles).

For example, with the following docker-compose.yml file

version: '3.9'
services
  app_service:
    # ...
  test_service:
    profiles:
      - testing
    # ...

Running docker-compose up will only start the app_service, and running docker-compose --profile testing up will start both the app_service and the test_service.

Multiple profiles can be specified by passing multiple --profile flags.

More info can be found here: https://docs.docker.com/compose/profiles/

Edit: I had to update to docker engine v20.10.5 for this to work.


One way to achieve that is to define your optional service in a different compose file. Then to start the optional service, run:

$ docker-compose -f docker-compose.yml -f optional-service.yaml up

For example, if I have a docker-compose.yml file that looks like:

version: '2.1'
services:
  lb:
    image: nginx:1.13           
  db:
    image: redis:3.2.9

I can extend it with an optional-service.yml that looks like:

version: '2.1'
services:
  busy:
    image: busybox

Notice that both compose files must use the same Compose file version.

You can read more about it in the Compose documentation.