执行docker compose up -d --build会清空PostgreSQL数据库?求排查
Docker Compose执行
up -d --build后PostgreSQL数据丢失排查 问题描述
我给Django应用和PostgreSQL数据库配置了Docker Compose,每次有新迁移时,执行docker compose up -d --build会导致数据库数据被清空。想排查问题原因,是不是--build参数导致的?
我的docker-compose.yaml配置:
version: "3.9" services: db: image: postgis/postgis:14-3.2 volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=db - POSTGRES_USER=user - POSTGRES_PASSWORD=123456 ports: - "5434:5432" web: restart: always build: . command: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: - "7000:8000" environment: - POSTGRES_NAME=db - POSTGRES_USER=user - POSTGRES_PASSWORD=123456 - UPLOAD_LOCATION_MEDIA=/srv/app/cdn/media - UPLOAD_LOCATION_IMAGE=/srv/app/cdn/image depends_on: - db
核心结论:--build不会导致数据清空
--build仅负责重新构建Django应用的镜像,只作用于web服务,和PostgreSQL容器的数据存储完全无关,不会触发数据库数据删除。
可能的问题原因及排查步骤
1. 数据卷挂载异常
PostgreSQL依赖./data/db本地目录持久化数据,如果挂载失败,容器会自动使用临时存储,重启后数据直接丢失:
- 检查主机
./data/db目录:正常情况下该目录应包含PostgreSQL核心文件(如base文件夹、pg_hba.conf配置文件),如果为空,说明挂载未生效。 - 修复目录权限:PostgreSQL容器内运行的
postgres用户UID为999,若主机目录权限不匹配,容器无法读写会切换到临时存储。执行以下命令修正:sudo chown -R 999:999 ./data/db - 验证挂载状态:执行
docker inspect db,查看Mounts字段下的Source是否指向主机的./data/db,Mode是否为rw(可读写)。
2. 迁移文件存在危险逻辑
新生成的迁移文件可能包含清空或删除数据的操作:
- 检查
app/migrations/下的最新迁移文件,看是否有删除表、删除字段的代码,或者RunPython块里写了批量删除数据的逻辑。 - 确认
migrate命令参数:你的web服务命令是python manage.py migrate,无--fake、--reset这类危险参数,但迁移文件本身的逻辑可能导致数据丢失。
3. PostgreSQL容器被意外重置
- 排查是否执行过
docker compose down -v:该命令会删除所有数据卷(包括db的本地挂载卷),直接导致数据丢失。 - 查看db容器日志:执行
docker compose logs db,如果每次启动都出现initializing database的日志,说明容器每次都在重新初始化,即数据卷未正常工作。
4. 其他可能性
- 检查是否有部署脚本或工具执行了
flush、reset_db等清空数据库的命令。 - 确认db容器未被强制重建:
docker compose up -d --build默认不会重建db容器,除非修改了db服务的配置(如镜像版本、环境变量),但即使重建,只要数据卷正常挂载,数据也不会丢失。
内容的提问来源于stack exchange,提问作者Ali Shekari
相关产品推荐
相关产品推荐

