g3w-suite/g3w-suite-docker

Share common `docker-compose.yml` configuration between various environments (production, development, maintenance)

Raruto opened this issue · 0 comments

By default, docker compose reads two files, a docker-compose.yml and an optional docker-compose.override.yml file.

By convention:

  • the docker-compose.yml contains your base configuration.
  • the docker-compose.override.yml contains configuration overrides for existing services or entirely new services.

A common use case for multiple files is changing a development Compose app for a production-like environment (which may be production, staging or CI). To support these differences, you can split your Compose configuration into a few different files

More info:


For example, here's how we could simplify the docker-compose-dev.yaml file:

docker compose \
  --file ../g3w-suite-docker/docker-compose.yml \
  --file ../g3w-suite-docker/docker-compose-dev.yml \
  ...
# ../g3w-suite-docker/docker-compose-dev.yml

version: "3"
services:

  postgis:
    restart: "no" # disable autorestart
    volumes:
      - g3wsuite-pg-data:/var/lib/postgresql
    networks:
      internal:
        aliases:
          - ${WEBGIS_PUBLIC_HOSTNAME}

  g3w-suite:
    environment:
      - BITBUCKET_TOKEN
      - G3WSUITE_QDJANGO_SERVER_URL
      - G3WSUITE_DEBUG
    ports:
      - "8000:8000"
    restart: "no" # disable autorestart
    volumes:
      - ./scripts:/scripts
    entrypoint: /scripts/docker-entrypoint-dev.sh

  nginx:
    deploy:
      replicas: 0  # disable nginx service

  certbot:
    deploy:
      replicas: 0  # disable certbot service

volumes:
  shared-volume:
  g3wsuite-pg-data:

networks:
  internal:
# ../g3w-suite-docker/docker-compose.yml

version: "3"
services:

  postgis:
    image: g3wsuite/postgis:11.0-2.5
    ports:
      - "5439:5432"
    environment:
      - POSTGRES_DBNAME=${G3WSUITE_POSTGRES_DBNAME},data_testing,data_production
      - POSTGRES_USER=${G3WSUITE_POSTGRES_USER_LOCAL}
      - POSTGRES_PASS=${G3WSUITE_POSTGRES_PASS}
      - ALLOW_IP_RANGE=0.0.0.0/0
    restart: on-failure
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
    volumes:
      - ${WEBGIS_DOCKER_SHARED_VOLUME}:/var/lib/postgresql
    healthcheck:
      interval: 60s
      timeout: 30s
      retries: 3
      test: "pg_isready"
    networks:
      internal:

  g3w-suite:
    image: g3wsuite/g3w-suite:dev
    environment:
      - G3WSUITE_TILECACHE_PATH
      - G3WSUITE_POSTGRES_DBNAME
      - G3WSUITE_POSTGRES_USER
      - G3WSUITE_POSTGRES_USER_LOCAL
      - G3WSUITE_POSTGRES_PASS
      - G3WSUITE_POSTGRES_HOST
      - G3WSUITE_POSTGRES_PORT
      - G3WSUITE_ORS_API_ENDPOINT
      - G3WSUITE_ORS_API_KEY
      - TILESTACHE_CACHE_BUFFER_SIZE
      - TILESTACHE_CACHE_TOKEN
      - G3WSUITE_GUNICORN_NUM_WORKERS
      - G3WSUITE_GUNICORN_MAX_REQUESTS
      - G3WSUITE_GUNICORN_TIMEOUT
      - FRONTEND
      - PGSERVICEFILE
      - QGIS_SERVER_LOG_FILE
      - QGIS_SERVER_LOG_LEVEL
    expose:
      - "8000"
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
    depends_on:
      - postgis
    volumes:
      - ${WEBGIS_DOCKER_SHARED_VOLUME}:/shared-volume
      - ${WEBGIS_DOCKER_SHARED_VOLUME}/node_modules:/code/node_modules
      - ./config/g3w-suite/overrides/templates:/code/templates:ro
      - ./config/g3w-suite/settings_docker.py:/code/g3w-admin/base/settings/local_settings.py
      - ./secrets/pg_service.conf:${PGSERVICEFILE}
    networks:
      internal:

  nginx:
    image: nginx
    ports:
      - "8080:8080"
      - "443:443"
    expose:
      - "8080"
    volumes:
      - ${WEBGIS_DOCKER_SHARED_VOLUME}:/shared-volume
      - ${WEBGIS_DOCKER_SHARED_VOLUME}/var/www/.well-known:/var/www/.well-known
      - ${WEBGIS_DOCKER_SHARED_VOLUME}/certs/letsencrypt:/etc/letsencrypt:ro
      - ./config/g3w-suite/overrides/static:/shared-volume/static/overrides:ro
      - ./config/nginx:/etc/nginx/conf.d:ro
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
    restart: always
    networks:
      internal:

  # Letsencrypt certs
  certbot:
    image: certbot/certbot
    volumes:
      - ${WEBGIS_DOCKER_SHARED_VOLUME}/var/www/certbot:/var/www/certbot
      - ${WEBGIS_DOCKER_SHARED_VOLUME}/certs/letsencrypt:/etc/letsencrypt

volumes:
  shared-volume:
  g3wsuite-pg-data:

networks:
  internal:

NB Similarly for the following files there is no particular reason why they are separated: