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

Docker中PostgreSQL容器重启后数据不持久化问题求助

问题原因与解决办法

核心问题

你的postgres_data卷配置了external: true,这表示Docker会使用预先创建的外部卷而非自动生成的命名卷。如果这个外部卷未正确创建、关联,或是操作中出现权限问题,就会导致容器重启后PostgreSQL数据丢失,每次都要重新执行迁移。

解决步骤

1. 移除外部卷配置(推荐方案)

如果你不需要依赖外部卷,直接删除volumes段的external: true,修改后的docker-compose.yml如下:

version: '3.7'

services:
  web:
    build: .
    command: python3 /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"

volumes:
  postgres_data:

修改后Docker会自动创建内部命名卷,docker-compose down默认不会删除该卷,数据会持久保留。

2. 清理旧环境并重新初始化

如果之前的外部卷已出现异常,先清理旧容器和卷:

# 停止并删除现有容器
docker-compose down
# 删除有问题的外部卷(确认无重要数据后执行)
docker volume rm postgres_data
# 重新启动服务并执行迁移
docker-compose up -d
docker-compose exec web python3 manage.py migrate

此后再执行docker-compose down重启容器,数据会自动加载,无需重复迁移。

3. 外部卷权限修复(若需保留外部卷)

如果必须使用外部卷,需确保卷目录权限匹配PostgreSQL容器内的postgres用户(UID为999):

docker run --rm -v postgres_data:/data alpine chown -R 999:999 /data

注意事项

  • 不要随意执行docker-compose down -v,该参数会删除所有关联卷,直接清空数据。
  • 确认Django配置中数据库连接的HOST为db(对应compose中的服务名),避免连接到本地PostgreSQL实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:46:00