Localhost не работает, когда я докеризирую postgres с Django
Моя система - Ubuntu 22.04.1 LTS.
Я просматривал книгу Django для профессионалов и следовал всем строчка за строчкой, но почему-то при докеризации моего проекта django с postgres он просто не запускается на localhost должным образом, с sqlite все работает нормально.
Dockerfile
# Pull base image
FROM python:3.10.6-slim-bullseye
# Set environment variables
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
WORKDIR /code
# Install dependencies
COPY ./requirements.txt .
RUN pip install -r requirements.txt
# Copy project
COPY . .
docker-compose.yml
version: "3.9"
services:
web:
build: .
command: python /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- 8000:8000
depends_on:
- db
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
volumes:
postgres_data:
django.settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "postgres",
"USER": "postgres",
"PASSWORD": "postgres",
"HOST": "db", # set in docker-compose.yml
"PORT": 5432, # default postgres port
}
}
Когда я запускаю docker-compose up
, это показывает и кажется, что все должно быть хорошо, но почему-то это не работает:
Подключение к ch3-postgresql_web_1, ch3-postgresql_db_1 web_1 | Наблюдение за изменениями файлов с помощью StatReloader web_1 | Выполнение проверки системы... web_1 | web_1 | Проверка системы не выявила проблем (0 промолчали). db_1 | db_1 | Каталог базы данных PostgreSQL, похоже, содержит базу данных; Пропуск инициализации db_1 | db_1 | db_1 | 2022-12-05 11:58:21.572 UTC 1 LOG: запуск PostgreSQL 13.9 (Debian 13.9-1.pgdg110+1) на x86_64-pc-linux-gnu, скомпилирован gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit db_1 | 2022-12-05 11:58:21.574 UTC 1 LOG: прослушивание на IPv4-адресе "0.0.0.0", порт 5432 db_1 | 2022-12-05 11:58:21.575 UTC >1 LOG: прослушивание IPv6 адреса "::", порт 5432 db_1 | 2022-12-05 11:58:21.577 UTC 1 LOG: прослушивание на Unix сокете "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2022-12-05 11:58:21.580 UTC [26] LOG: система базы данных была выключена в 2022-12-05 11:58:17 UTC db_1 | 2022-12-05 11:58:21.584 UTC 1 LOG: система базы данных готова принимать соединения
Когда я перехожу по url 127.0.0.1:8000:
На этот сайт невозможно зайти Веб-страница по адресу http://127.0.0.1:8000/ может быть временно не работает или переехала на новый веб-адрес. ERR_SOCKET_NOT_CONNECTED
Если я подожду некоторое время, а затем проверю docker-compose logs
, появится сообщение "psycopg2.OperationalError: connection to server at "db" (172.21.0.2), port 5432 failed: Connection timed out
web_1 | Работает ли сервер на этом хосте и принимает ли он TCP/IP соединения?
"
Я потратил много часов на поиск информации об этой проблеме, но ничего не помогло. Я пробовал даже переустанавливать разные версии Postgres и docker.
Просто попробуйте следующее:
измените это:
volumes:
- postgres_data:/var/lib/postgresql/data/
К этому:
volumes:
- postgres_data:/var/lib/postgresql/data #removed forward slash from here.
Попробуйте вышеуказанную вещь и посмотрите, решит ли она эту проблему.
Примечание: после внесения указанных выше изменений не забудьте пересобрать docker-compsoe
Вам потребуется добавить дополнительные переменные окружения, чтобы PostgreSQL работал.
Обратитесь к https://hub.docker.com/_/postgres "Переменные среды"
Единственная переменная, которая требуется, это
POSTGRES_PASSWORD
, остальные необязательны.
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
- POSTGRES_HOST_AUTH_METHOD=trust
Кроме того, вам рекомендуется сделать ваш файл docker compose более безопасным:
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- .env.dev
.env.dev
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
POSTGRES_HOST_AUTH_METHOD=trust