Is it possible to set global settings for services in a docker compose file?

Viewed 435

Is it possible to specify global settings for services in a Docker compose file?

For example, take this Docker Compose file:

version: "3.9"

services:
  test1:
    env_file: /path/to/env/file
    image: test
    container_name: test1
    ports:
      - "1234:22"
    networks:
      - dmz
    restart: always
  test2:
    env_file: /path/to/env/file
    image: test
    container_name: test2
    ports:
      - "2345:22"
    networks:
      - trust
    restart: always

networks:
  dmz:
    driver: bridge
  trust:
    driver: bridge

I don't want to have env_file: /path/to/env/file for every service and would like to make it apply to all services. I know I can pass it in the docker-compose command line but I'm hoping to do it from within the Docker compose file.

2 Answers

Although @timsmelik's answer points in the right direction and shows how to use a yaml anchor and alias with scalar values, you can probably take advantage of the merge key yaml feature here to set overridable default values for your services.

Here is an example to illustrate

version: "3.9"

x-service_defaults: &service_defaults
  env_file: /path/to/env/file
  image: test
  restart: always

services:
  test1:
    << : *service_defaults
    container_name: test1
    ports:
      - "1234:22"
    networks:
      - dmz
  test2:
    << : *service_defaults
    container_name: test2
    ports:
      - "2345:22"
    networks:
      - trust
  test3:
    << : *service_defaults
    env_file: /some/override/env/file
    container_name: test3
    volumes:
      - /some/bind/dir:/whatever/target

networks:
  dmz:
    driver: bridge
  trust:
    driver: bridge

You can find a pretty good comprehensive explanation of all possible yaml anchor/alias usage applied to docker-compose files in the following blog post

Try using extensions as fragments.

With the support for extension fields, Compose file can be written as follows to improve readability of reused fragments:

This is the example from the README.md:


x-logging: &default-logging
  options:
    max-size: "12m"
    max-file: "5"
  driver: json-file

services:
  frontend:
    image: awesome/webapp
    logging: *default-logging
  backend:
    image: awesome/database
    logging: *default-logging
Related