Работает ли сервер на хосте "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