Can you define optional docker-compose services?

Viewed 15149

Is there a way to define a Docker Compose service such that it is only brought up when you explicitly request it?

That is to say:

docker-compose up

would not start it, but

docker-compose up optional_service

would.

3 Answers

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.

The extend keyword has been removed in version 3.x.

I faced the same issue and this is what I did:

  • From Docker's official docs, we can use a COMPOSE_FILE environment variable in a .env file.
  • The way this works is: when you do docker-compose up, instead of reading docker-compose.yml, it will read all the compose files specified in COMPOSE_FILE variable.

For example,

COMPOSE_FILE=docker-compose.yml:./optional/docker-compose.prod.yml
  • the good part is that:
    • the .env file is auto-read (if located in the same level as docker-compose.yml), when we invoke docker-compose up.
    • no need to specify each file with a -f flag in CLI.
  • The one drawback is: need to create separate compose files for each service you wish to make optional.

Note: separate file names with a : in case of linux or ; in case of windows.

Related