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
Вернуться на верх