Локальные данные PostgreSQL не отображаются в Docker Container

Мне просто нужна помощь, я застрял в Docker и не могу найти выход. Во-первых, я использую Windows для Django APP и Docker

Я использую PgAdmin4 с PostgreSQL 14 и создал новый сервер для docker

Журнал для Postgres Image:

2022-07-16 19:39:23.655 UTC [1] LOG:  starting PostgreSQL 14.4 (Debian 14.4-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-07-16 19:39:23.673 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2022-07-16 19:39:23.673 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2022-07-16 19:39:23.716 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2022-07-16 19:39:23.854 UTC [26] LOG:  database system was shut down at 2022-07-16 16:50:47 UTC
2022-07-16 19:39:23.952 UTC [1] LOG:  database system is ready to accept connections

PostgreSQL Database directory appears to contain a database; Skipping initialization

Журнал с моего изображения: (вы можете видеть, что у него нет миграций)

0 static files copied to '/app/static', 9704 unmodified.
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, controle, sessions
Running migrations:
  No migrations to apply.
Performing system checks...

System check identified no issues (0 silenced).
July 16, 2022 - 16:40:38
Django version 4.0.6, using settings 'setup.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Мой docker-compose:

version: "3.9"

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    networks:
      - django_net
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  web:
    build: .
    command: >
            sh -c "python manage.py collectstatic --noinput &&
                   python manage.py migrate &&
                   python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      - POSTGRES_NAME=${POSTGRES_NAME}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    networks:
      - django_net


networks:
  django_net:
    driver: bridge

И мой файл .env:

SECRET_KEY='django-insecure-1l2oh_bda$@s0w%d!@qyq8-09sn*8)6u-^wb(hx03==(vjk16h'
DATABASE_URL=postgres://postgres:mypass@host.docker.internal/mydb
POSTGRES_NAME=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=mypass
POSTGRES_DB=mydb
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]

Итак, анализируя логи последней строки Postgres, он нашел мою локальную БД (правильно ли это ?) и не инициализировал, но мой суперпользователь исчез, а значит и мои данные.

Есть ли что-то, что я упускаю? Может быть, все так и есть, а я не знаю... Чтобы убедиться, я напечатал несколько строк из PGAdmin и экрана APP

DB:

My DB data

Мой APP:

Nothing

Надеюсь, мой ответ поможет вам решить проблему. Пожалуйста, измените конфигурацию следующим образом: версия: "3.9"

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    networks:
      - django_net
    environment:
      - POSTGRES_DB=${POSTGRES_DB:-djangodb}
      - POSTGRES_USER = ${POSTGRES_USER:-postgres}
      - POSTGRES_PASSWORD = ${POSTGRES_PASSWORD:-changeme}
    ports:
      - "5432:5432"

  web:
    build: .
    command: >
            sh -c "python manage.py collectstatic --noinput &&
                   python manage.py migrate &&
                   python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - db
    environment:
      - POSTGRES_NAME=${POSTGRES_NAME:-djangodb}
      - POSTGRES_USER=${POSTGRES_USER:-postgre}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgre}
    networks:
      - django_net


networks:
  django_net:
    driver: bridge

В этой установке я вижу две вещи:

  1. Вы настроили DATABASE_URL указывать на host.docker.internal, поэтому ваш контейнер обращается из пространства Docker к тому, что прослушивает порт 5432.

  2. В вашем файле Compose контейнер db не имеет ports:, поэтому вы не подключаетесь к базе данных, которую запускает ваша установка Compose.

Это предполагает, что на вашем хосте запущена другая копия сервера PostgreSQL, и ваше приложение подключается к ней. (Возможно, у вас хост под MacOS, и вы установили его через Homebrew?)

Для соединения между контейнерами вам не нужно выполнять никаких специальных настроек; просто используйте имя службы Compose db в качестве имени хоста. Специальное имя host.docker.internal здесь не нужно. (Вы также можете удалить networks: из файла, если только вы удалите их все; Compose создаст для вас сеть с именем default и автоматически присоединит к ней контейнеры). Я могу настроить это в файле Compose, переопределив файл .env

version: '3.8'
services:
  db: { ... }
  web:
    environment:
      - DATABASE_URL=postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@db/$(POSTGRES_DB)

Если я правильно понял ваш вопрос, вы не можете подключиться к созданной базе данных.

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

 services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    networks:
      - django_net
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    ports:
      - "5432:5432"

Надеюсь, я правильно понял ваш вопрос о том, что вы не можете подключиться к новой базе данных, и надеюсь, мой ответ поможет вам.

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