Работает ли сервер на хосте "localhost" (::1) и принимает соединения web_1 | TCP/IP на порт 5432?

Здравствуйте, у меня возникла ошибка, как в заголовке, при создании веб-приложения Django. Я получаю эту ошибку

Is the server running on host "localhost" (::1) and accepting
web_1  |        TCP/IP connections on port 5432?

Я понятия не имею, как я могу это решить, я уже перезапустил базу данных Postgresql и docker, но ни одно из них не работает.

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'fitshop',
        'USER': 'fitshopuser',
        'PASSWORD': 'fitpass',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

docker-compose.yml

version: "3"
   

    services:
      db:
        image: postgres
        volumes:
          - ./data/db:/var/lib/postgresql/data
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=fitshopuser
          - POSTGRES_PASSWORD=postgres
        ports:
          - "5432:5432"
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db

При запуске в docker вы можете использовать имя сервиса в качестве имени хоста. Таким образом, настройки вашей базы данных Django будут выглядеть следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'fitshopuser',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': '5432',
    }
}

Значения в настройках должны быть равны переменным среды, указанным в файле docker-compose для db

        environment:
          - POSTGRES_DB=postgres          # NAME
          - POSTGRES_USER=fitshopuser     # USER
          - POSTGRES_PASSWORD=postgres    # PASSWORD

Согласно вашей конфигурации docker для Postgres, docker инициализирует базу данных с именем postgres с именем пользователя fitshopuser, паролем postgres и именем хоста db на порту 5432.
Следует использовать эти значения в настройках Django.

Об ошибке:

Работает ли сервер на хосте "localhost" (::1) и принимает ли он web_1 | TCP/IP соединения на порт 5432?

с depends_on в службе с именем web только проверяет, запущена служба db или нет. Это не означает, что база данных Postgres запущена.

Об этом можно узнать в официальной документации по docker здесь.

        depends_on:
          - db

Для проверки готовности Postgres и приема соединений через порт 5432 используйте скрипты типа wait-for-it

ИЛИ

Я бы просто установил postgresql-client в службу с именем web и с помощью команды pg_isready проверил, готов ли Postgres.

Добавьте эти строки в dockerfile.

RUN apt-get install -y postgresql-client

# provide permissions to run the entrypoint script (update path accordingly)
RUN chmod +x /path/to/entrypoint.sh

Обновить/Добавить файл entrypoint.sh.

# entrypoint.sh
while ! pg_isready -h db -p 5432 --username=fitshopuser ; do
    echo "Postgres is unavailable - sleeping"
    sleep 2
done

Укажите точку входа в сервис с именем web.

      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        restart: always
        ports:
          - "8000:8000"
        entrypoint: "/path/to/entrypoint.sh"   # Update path
        depends_on:
          - db
Вернуться на верх