Docker+Django+PostgreSQL启动后无法识别已有数据求助
问题描述
我在学习使用Docker部署Django与PostgreSQL数据库,每次执行docker compose up --build -d --remove-orphans命令后,所有镜像均已启动,但无法使用已注册的超级用户凭据登录Django admin后台。通过PGAdmin查看PostgreSQL数据库,之前创建的数据仍存在,但重启电脑后再次启动Docker Compose时,Django无法识别这些已有数据。
提供的配置文件
docker-compose.yml
version: "3.9" services: api: build: context: . dockerfile: ./docker/local/django/Dockerfile command: /start volumes: - .:/app - ./staticfiles:/app/staticfiles - ./mediafiles:/app/mediafiles expose: - "8000" env_file: - .env depends_on: - postgres-db - redis networks: - estate-react client: build: context: ./client dockerfile: Dockerfile.dev restart: on-failure volumes: - ./client:/app - /app/node_modules networks: - estate-react postgres-db: image: postgres:12.0-alpine ports: - "5432:5432" volumes: - ./postgres_data:/var/lib/postgresql environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} networks: - estate-react redis: image: redis:5-alpine networks: - estate-react celery_worker: build: context: . dockerfile: ./docker/local/django/Dockerfile command: /start-celeryworker volumes: - .:/app env_file: - .env depends_on: - redis - postgres-db networks: - estate-react flower: build: context: . dockerfile: ./docker/local/django/Dockerfile command: /start-flower volumes: - .:/app env_file: - .env ports: - "5557:5555" depends_on: - redis - postgres-db networks: - estate-react nginx: restart: always depends_on: - api volumes: - static_volume:/app/staticfiles - media_volume:/app/mediafiles build: context: ./docker/local/nginx dockerfile: Dockerfile ports: - "8080:80" networks: - estate-react networks: estate-react: driver: bridge volumes: postgres_data: static_volume: media_volume:
Nginx default.conf
upstream api { server api:8000; } upstream client { server client:3000; } server { client_max_body_size 20M; listen 80; location /api/v1 { proxy_pass http://api; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } location /admin { proxy_pass http://api; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } location /staticfiles/ { alias /app/staticfiles/; } location /mediafiles/ { alias /app/mediafiles/; } location /sockjs-node { proxy_pass http://client; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } location / { proxy_pass http://client; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } }
解决方案
1. 修正PostgreSQL数据卷挂载路径
PostgreSQL官方镜像的默认数据存储目录是/var/lib/postgresql/data,你当前挂载的是/var/lib/postgresql,这会导致容器启动时自动创建新的data子目录并初始化空数据库,而非复用已有数据。修改docker-compose.yml中postgres-db的volumes配置:
volumes: - ./postgres_data:/var/lib/postgresql/data
2. 核对Django与PostgreSQL的数据库配置一致性
检查项目根目录的.env文件,确保DATABASE相关配置与PostgreSQL容器的环境变量完全匹配:
DATABASE_HOST=postgres-db(必须与docker-compose中PostgreSQL服务名一致)DATABASE_NAME、DATABASE_USER、DATABASE_PASSWORD分别对应POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORDDATABASE_PORT保持默认的5432或留空
3. 检查Django启动脚本是否存在数据库重置操作
查看/start脚本内容,确保没有执行python manage.py flush、python manage.py migrate --fresh这类会清空或重置数据库的命令。正常启动只需执行迁移:
python manage.py migrate
4. 修复数据卷目录权限
PostgreSQL容器以postgres用户(UID=999)运行,需要确保本地./postgres_data目录权限正确,否则容器无法读写数据:
sudo chown -R 999:999 ./postgres_data
5. 规范容器启动命令
日常启动无需每次构建镜像,用以下命令即可:
docker compose up -d
若需重新构建镜像,先停止容器(不要删除数据卷):
docker compose down docker compose up --build -d
注意:绝对不要使用docker compose down -v,该命令会删除所有数据卷,导致数据丢失。
内容的提问来源于stack exchange,提问作者henoker

