'Django/Docker/Postgresql: app connected to the 'wrong' database

I have develop a project with Django/Docker/Postgresql and use docker-compose to deploy on a linux remote server.

I want to deploy 2 apps based on the same code (and same settings file), preprod and demo, with two disctincts PostgreSQL databases (databases are not dockerized): ecrf_covicompare_preprod and ecrf_covicompare_demo, respectively for preprod and demo. Apps tests will be done by differents teams.

I have :

  • 2 docker-compose files, docker-compose.preprod.yml and docker-compose.demo.yml, respectively for preprod and demo
  • .env files, .env.preprod and .env.preprod.demo, respectively for preprod and demo

Databases parameters of connection are set in these .env files.

But my 2 apps connect to the same database (ecrf_covicompare_preprod).

If I connect to my 'web demo' container to print environment variables I get SQL_DATABASE=ecrf_covicompare_demo which is correct

docker-compose.preprod.yml

version: '3.7'

services:
    web:
        restart: always
        container_name: ecrf_covicompare_web
        build:
            context: ./app
            dockerfile: Dockerfile.preprod
        command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
        volumes:
            - app_volume:/usr/src/app
            - static_volume:/usr/src/app/static
            - media_volume:/usr/src/app/media
        expose:
            - 8000
        env_file:
            - ./.env.preprod
        entrypoint: [ "/usr/src/app/entrypoint.preprod.sh" ]
        depends_on:
            - redis
        healthcheck:
            test: [ "CMD", "curl", "-f", "http://localhost:8000/" ]
            interval: 30s
            timeout: 10s
            retries: 50

    redis:
        container_name: ecrf_covicompare_redis
        image: "redis:alpine"

    celery:
        container_name: ecrf_covicompare_celery
        build:
            context: ./app
            dockerfile: Dockerfile.preprod
        command: celery -A core worker -l info
        volumes:
            - app_volume:/usr/src/app
        env_file:
            - ./.env.preprod
        depends_on:
            - web
            - redis

    celery-beat:
        container_name: ecrf_covicompare_celery-beat
        build:
            context: ./app
            dockerfile: Dockerfile.preprod
        command: celery -A core beat -l info
        volumes:
            - app_volume:/usr/src/app
        env_file:
            - ./.env.preprod
        depends_on:
            - web
            - redis

    nginx:
        container_name: ecrf_covicompare_nginx
        build: ./nginx
        restart: always
        volumes:
            - static_volume:/usr/src/app/static
            - media_volume:/usr/src/app/media
        ports:
            - 1370:80
        depends_on:
            - web

.env.preprod

SQL_DATABASE=ecrf_covicompare_preprod
SQL_USER=user_preprod
DATABASE=postgres
DJANGO_SETTINGS_MODULE=core.settings.preprod

docker-compose.demo.yml (simplified)

version: '3.7'

services:
    demo_web:
        container_name: ecrf_covicompare_web_demo
        //
        env_file:
            - ./.env.preprod.demo
        //

    demo_redis:
        container_name: ecrf_covicompare_redis_demo
        image: "redis:alpine"

    demo_celery:
        container_name: ecrf_covicompare_celery_demo
        //
        env_file:
            - ./.env.preprod.demo
        depends_on:
            - demo_web
            - demo_redis

    demo_celery-beat:
        container_name: ecrf_covicompare_celery-beat_demo
        //
        env_file:
            - ./.env.preprod.demo
        depends_on:
            - demo_web
            - demo_redis

    demo_nginx:
        container_name: ecrf_covicompare_nginx_demo
        //
        ports:
            - 1380:80
        depends_on:
            - demo_web

.env.preprod.demo

SQL_DATABASE=ecrf_covicompare_demo
SQL_USER=user_preprod
DATABASE=postgres
DJANGO_SETTINGS_MODULE=core.settings.preprod

enter image description here



Solution 1:[1]

Im new to all the docker compose stuff but to me your configuration looks fine. A few ideas I had:

  • you mention two different PostgreSQL databases. Are those hosted on the same PostgreSQL server or two different servers? In both .env files you set DATABASE=postgres. If they are running on the same server instance I could imagine that this leads to them using the same database depending on how this variable is used later on.

  • are you sure that the env variables are set on time? Once you manually check them from inside th container they are set correctly. But also while your containers are booting up? No expert on how docker compose handles these files but maybe you could try printing the env variables during container initialization from within some script.

  • Are you completely sure its not hardcoded somewhere? Maybe try searching all source files for the DB name they both connect to. I failed with this far too often to not check this.

Hope this helps. Its a bit of a guess but your configuration looks fine to me otherwise.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Verbindungsfehler