Docker容器中PostgreSQL数据不显示的Django应用求助
问题:Docker部署Django+PostgreSQL后超级用户及应用数据丢失
在Windows环境下基于Docker部署Django应用,使用PgAdmin4管理PostgreSQL 16并创建新服务器。PostgreSQL检测到本地数据库目录已有数据跳过初始化,但Django应用内的超级用户及业务数据丢失,PgAdmin显示数据库存在数据,但应用页面为空。
PostgreSQL镜像日志
PostgreSQL Database directory appears to contain a database; Skipping initialization 2023-11-23 20:17:38.008 UTC [1] LOG: starting PostgreSQL 16.1 (Debian 16.1-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit 2023-11-23 20:17:38.008 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 2023-11-23 20:17:38.008 UTC [1] LOG: listening on IPv6 address "::", port 5432 2023-11-23 20:17:38.027 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2023-11-23 20:17:38.086 UTC [30] LOG: database system was shut down at 2023-11-23 20:17:11 UTC 2023-11-23 20:17:39.317 UTC [1] LOG: database system is ready to accept connections
Web应用日志
No changes detected Operations to perform: Apply all migrations: admin, auth, base, contenttypes, sessions Running migrations: No migrations to apply. Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). November 23, 2023 - 20:17:44 Django version 4.2.2, using settings 'cutler.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.
docker-compose.yml配置
version: '3.9' services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} ports: - '5432:5432' web: build: . command: bash -c "sleep 5 && python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: - "8000:8000" depends_on: - db links: - db environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
settings.py数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('POSTGRES_DB'), 'USER': os.environ.get('POSTGRES_USER'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'HOST': 'db', 'PORT': 5432, } }
排查与解决步骤
- 核对数据库连接一致性:确认
.env文件中的POSTGRES_DB、POSTGRES_USER与PgAdmin中连接的数据库名称、用户完全匹配。若Django连接的是其他数据库,会导致数据无法读取。 - 清理旧数据卷重新初始化:Windows下Docker本地卷可能残留旧数据库数据,停止容器并清理:
docker-compose down -v # Windows命令行执行 rmdir /s ./data/db # 重新构建启动 docker-compose up --build - 重新创建超级用户:若数据库已正确初始化但用户丢失,进入web容器执行:
docker-compose exec web python manage.py createsuperuser - 验证迁移执行状态:手动检查迁移是否完全应用:
若存在未应用的迁移,执行docker-compose exec web python manage.py showmigrationspython manage.py migrate --force强制同步。 - 检查数据库路由配置:确认
settings.py中无错误的DATABASE_ROUTERS配置,避免数据被路由到其他数据库。
内容的提问来源于stack exchange,提问作者sandorka
相关产品推荐
相关产品推荐

