Django/Docker/Postgresql: приложение подключилось к "неправильной" базе данных

Я разработал проект с Django/Docker/Postgresql и использую docker-compose для развертывания на удаленном сервере linux.

Я хочу развернуть 2 приложения, основанных на одном и том же коде (и одном файле настроек), preprod и demo, с двумя различными базами данных PostgreSQL (базы данных не докеризованы): ecrf_covicompare_preprod и ecrf_covicompare_demo, соответственно для preprod и demo. Тестирование приложений будет проводиться разными командами.

У меня есть :

  • 2 файла docker-compose, docker-compose.preprod.yml и docker-compose.demo.yml, соответственно для preprod и demo
  • .
  • .env файлы, .env.preprod и .env.preprod.demo, соответственно для preprod и demo

Параметры подключения к базам данных задаются в этих .env файлах.

Но мои 2 приложения подключаются к одной и той же базе данных (ecrf_covicompare_preprod).

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 (упрощенный)

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

Я новичок во всем, что касается docker compose, но для меня ваша конфигурация выглядит нормально. Несколько идей, которые у меня возникли:

  • Вы упоминаете две разные базы данных PostgreSQL. Они размещены на одном сервере PostgreSQL или на двух разных серверах? В обоих .env файлах вы установили DATABASE=postgres. Если они работают на одном сервере, я могу предположить, что это приведет к использованию одной и той же базы данных, в зависимости от того, как эта переменная будет использоваться в дальнейшем.

    .
  • Вы уверены, что переменные env установлены вовремя? Когда вы вручную проверяете их изнутри контейнера, они устанавливаются правильно. Но также во время загрузки контейнеров? Я не специалист в том, как docker compose обрабатывает эти файлы, но, возможно, вы можете попробовать распечатать переменные env во время инициализации контейнера из какого-нибудь скрипта.

  • Вы полностью уверены, что это не закодировано где-то? Может быть, попробуйте поискать во всех исходных файлах имя БД, к которой они оба подключаются. Я слишком часто терпел неудачу, чтобы не проверить это.

  • Надеюсь, это поможет. Это небольшое предположение, но в остальном ваша конфигурация кажется мне нормальной.

Вернуться на верх