You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 showmigrations
    
    若存在未应用的迁移,执行python manage.py migrate --force强制同步。
  • 检查数据库路由配置:确认settings.py中无错误的DATABASE_ROUTERS配置,避免数据被路由到其他数据库。

内容的提问来源于stack exchange,提问作者sandorka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:57:35