Проблема с подключением к PostrgreSQL на localhost в приложении Django

Я использую Docker для запуска моего приложения Django, и у меня есть несколько образов в нем: PostgreSQL, celery_worker, celery_beat и django_app. Все они, кроме celery_beat, работают нормально. Я использую следующую команду для сборки docker:

docker-compose -f docker-compose.yml up -d --build

Когда я открываю Docker Desktop, я вижу, что он перезапускает все образы, все работает нормально в течение нескольких секунд, затем он выходит из celery-beat и возвращается в образ celery-beat со следующей ошибкой:

[2022-10-13 15:34:59,440: WARNING/MainProcess] could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 5432?

Я перепробовал множество решений, которые нашел на StackOverflow и других страницах, но безуспешно. 4 из 5 изображений работают нормально. При нажатии на изображение postgreSQL я вижу следующий статус:

2022-10-13 13:27:04.195 UTC [1] LOG:  database system is ready to accept connections

docker-compose.yml

version: '3.8'

services:
    db:
        image: postgres:14.0-alpine
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=PF23_admin
          - POSTGRES_DB=postgres
        container_name: docerized_app_db_postgresql_dev
  
    app:
      build:
        context: ./backend
        dockerfile: Dockerfile
      restart: always
      command: python manage.py runserver 0.0.0.0:8000
      volumes:
        - ./backend/:/usr/src/backend/
      ports:
        - 8000:8000
      env_file:
        - ./.env
      depends_on:
        - db
      container_name: docerized_app_django_app_dev
    
    redis:
      image: redis:7-alpine
      ports:
        - "6379:6379" 
      container_name: docerized_app_redis_dev
        
    celery_worker:
      restart: always
      build:
        context: ./backend
      command: celery -A docerized_app_settings worker --loglevel=info --logfile=logs/celery.log
      volumes:
        - ./backend:/usr/src/backend
      env_file:
        - ./.env
      depends_on:
        - db
        - redis
        - app
      container_name: docerized_app_celery_worker_dev
  
    celery-beat:
      build: ./backend
      command: celery -A docerized_app_settings beat -l info
      volumes:
        - ./backend:/usr/src/backend
      env_file:
        - ./.env
      depends_on:
        - db
        - redis
        - app
      container_name: docerized_app_celery_beat_dev

volumes:
    postgres_data:

Docker - это что-то новое для меня, поэтому я не уверен, как это исправить. При запуске моего приложения в терминале (используя среду conda и ubuntu) все в порядке, и у меня нет проблем с подключением PostgreSQL.

Возможно, это глупая ошибка, и я не знаю о ней. Любая помощь будет принята с благодарностью.

Итак, есть две возможные проблемы.

  1. ваша строка подключения postgres в вашем контейнере docker должна использовать имя контейнера вашего экземпляра pg (db) в качестве имени хоста. (возможно, docerized_app_db_postgresql_dev. Я никогда не указывал имя контейнера явно, поэтому я не уверен на 100%, что он примет это.)
  2. По умолчанию конфигурации postgres не слушают внешние соединения, только локальный хост, поэтому в вашем контейнере postgres вам придется изменить postgres.conf, чтобы он слушал '*', а не localhost.

https://www.bigbinary.com/blog/configure-postgresql-to-allow-remote-connection

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