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

Docker+Django+PostgreSQL启动后无法识别已有数据求助

Django+PostgreSQL Docker部署数据持久化问题解决

问题描述

我在学习使用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_PASSWORD
  • DATABASE_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:50:57