Не удалось подключиться к контейнеру Postgres в Django

django.db.utils.OperationalError: соединение с сервером по адресу "db" (172.18.0.2), порт 5432 не удалось: FATAL: система базы данных запускается

У меня проблема с подключением к Postgres contaner. Я пробовал разные способы, например, устанавливать пароли только в файле docker-compose. Но все равно застрял.

docker-compose.yml

version: '3'
services:
  db:
    image: postgres:alpine
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_USER=user
      - POSTGRES_DB=userdb
    volumes:
      - django_db:/var/lib/postgresql/data
    container_name: db
  
  singup: 
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - 8000:8000
    container_name: singup
    depends_on:
      - db 
volumes:
  django_db:

настройка базы данных

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'userdb',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'db',
    }
}

Это проблема времени, даже если у вас есть следующая строка

  singup: 
    depends_on:
      - db 

Это просто ожидание запуска контейнера db, не обязательно Postgres.

Чтобы избежать этого, используйте такие инструменты, как wait-for-it, dockerize, sh-совместимый wait-for или шаблон RelayAndContainers. Это небольшие сценарии-обёртки, которые вы можете включить в образ вашего приложения для опроса заданного хоста и порта до тех пор, пока он не начнёт принимать TCP-соединения.

Например, чтобы использовать wait-for-it.sh или wait-for для обертывания команды вашего сервиса:

  singup: 
    depends_on:
      - db
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]

Перезапись ожидания: https://github.com/vishnubob/wait-for-it

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