Локальные данные 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:
Мой APP:
Надеюсь, мой ответ поможет вам решить проблему. Пожалуйста, измените конфигурацию следующим образом: версия: "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
В этой установке я вижу две вещи:
Вы настроили
DATABASE_URL
указывать наhost.docker.internal
, поэтому ваш контейнер обращается из пространства Docker к тому, что прослушивает порт 5432.В вашем файле 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"
Надеюсь, я правильно понял ваш вопрос о том, что вы не можете подключиться к новой базе данных, и надеюсь, мой ответ поможет вам.