Skip to content

YAML Anchors

Using YAML anchors is a great way to reduce configuration duplication and be able to add configuration to all containers in a single place.

Basic

You want all containers to have the same restart policy and the same memory limit of 2GB:

version: "3.9"

x-base: &base
  mem_limit: 2000m
  restart: always

services:
  radarr:
    <<: *base
    image: lscr.io/linuxserver/radarr
    container_name: radarr
    volumes:
      - ${APPSDIR}/radarr:/config
      - ${DATADIR}/media:/media
  sonarr:
    <<: *base
    image: lscr.io/linuxserver/sonarr
    container_name: sonarr
    volumes:
      - ${APPSDIR}/sonarr:/config
      - ${DATADIR}/media:/media

Every container with <<: *base will include everything listed under x-base, and changes to it will affect all containers.

Advanced

You have a few common templates, and you want to be able to use all of them:

  • base - The base of containers, you can safely assume that changes to it will affect all containers.
  • internalbase - The base + associating with the internal docker network.
  • vpnbase - The base + associating with the VPN network.
  • lsio - Common environment variables in all LSIO containers.
  • lsiobase - The base + associating with the internal docker network + LSIO variables.
  • vpnlsiobase - The base + associating with the VPN network + LSIO variables.
version: "3.9"

x-base: &base
  mem_limit: 2000m
  restart: always 
x-internalbase: &internalbase
  <<: *base
  networks:
    - internal
x-vpnbase: &vpnbase
  <<: *base
  network_mode: "service:vpn"
x-lsio: &lsio
  PUID: ${PUID}
  PGID: ${PGID}
  TZ: ${TZ}
x-lsiobase: &lsiobase
  <<: *internalbase
  environment:
    <<: *lsio
x-vpnlsiobase: &vpnlsiobase
  <<: *vpnbase
  environment:
    <<: *lsio

services:
  radarr:
    <<: *lsiobase
    image: lscr.io/linuxserver/radarr
    container_name: radarr
    volumes:
      - ${APPSDIR}/radarr:/config
      - ${DATADIR}/media:/media
  sonarr:
    <<: *lsiobase
    image: lscr.io/linuxserver/sonarr
    container_name: sonarr
    volumes:
      - ${APPSDIR}/sonarr:/config
      - ${DATADIR}/media:/media
  lidarr:
    <<: *vpnlsiobase
    image: lscr.io/linuxserver/lidarr:nightly
    container_name: lidarr
    volumes:
      - ${APPSDIR}/lidarr:/config
      - ${DATADIR}/media:/media
  prowlarr:
    <<: *vpnlsiobase
    image: lscr.io/linuxserver/prowlarr:nightly-alpine
    container_name: prowlarr
    volumes:
      - ${APPSDIR}/prowlarr:/config
  ombi:
    <<: *vpnlsiobase
    image: lscr.io/linuxserver/ombi:development
    container_name: ombi
    volumes:
      - ${APPSDIR}/ombi4:/config
  collabora:
    <<: *internalbase
    image: collabora/code
    container_name: collabora
    environment:
      domain: ${CLBDOMAIN}
      dictionaries: en_US

We easily associated 2 containers with lsiobase, 3 with vpnlsiobase, and 1 with internalbase.

Overriding Anchors

There may be a need to add environment variables beyond the ones defined in the base anchor, unfortunately when declaring the same section again it will override the base, not append to it. Instead, you need to make a separate anchor for the environment variables and use it directly.

For example:

x-base: &base
  mem_limit: 2000m
  restart: always 
x-internalbase: &internalbase
  <<: *base
  networks:
    - internal
x-lsio: &lsio
  PUID: ${PUID}
  PGID: ${PGID}
  TZ: ${TZ}
x-lsiobase: &lsiobase
  <<: *internalbase
  environment:
    <<: *lsio

services:
  mariadb:
    <<: *internalbase
    image: lscr.io/linuxserver/mariadb
    container_name: mariadb
    environment:
      <<: *lsio
      MYSQL_DIR: /config
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - ${APPSDIR}/mariadb:/config