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
相关产品推荐
相关产品推荐

