Docker+Django实现SQLite3数据库持久化方案咨询
解决SQLite3数据库持久化问题
问题根源分析
你的docker-compose-DEV.yml里同时配置了本地目录挂载和命名卷挂载,两者存在冲突:
- 你将本地项目根目录
./挂载到容器内的/app/doc-manager-web,这会覆盖容器内该路径下的所有内容,包括你试图用命名卷挂载的/app/doc-manager-web/data目录。 - 实际数据库文件存放在本地的
./data文件夹中,而非Docker命名卷里。当执行docker compose down或重新构建时,若本地data目录被意外重置(比如构建过程覆盖、手动清理等),就会导致数据库回滚。
修复方案
1. 调整Docker Compose的Volume配置
修改docker-compose-DEV.yml,避免本地目录挂载覆盖数据库目录。只挂载需要热更新的代码目录(比如Django项目的doc_manager文件夹),保留命名卷用于持久化数据库:
version: '3' services: web: build: context: . dockerfile: Dockerfile_DEV ports: - "8000:8000" volumes: # 仅挂载Django代码目录实现热更新,不覆盖data目录 - ./doc_manager:/app/doc-manager-web/doc_manager # 用命名卷持久化数据库目录 - data:/app/doc-manager-web/data volumes: data:
2. 确认Django数据库路径配置
打开Django项目的doc_manager/doc_manager/settings.py,检查DATABASES配置,确保数据库文件路径指向容器内的data目录:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # BASE_DIR为Django项目根目录,../data对应容器内的/app/doc-manager-web/data 'NAME': BASE_DIR / '../data/db.sqlite3', } }
3. 清理旧的无效挂载(可选)
如果之前本地./data目录存在无效数据,可先删除避免干扰:
rm -rf ./data
随后重新启动容器:
docker compose -f docker-compose-DEV.yml up --build
验证持久化
执行以下步骤测试:
- 在Django后台添加测试数据
- 执行
docker compose -f docker-compose-DEV.yml down - 重新启动容器:
docker compose -f docker-compose-DEV.yml up - 检查后台数据是否保留
配置完成后,数据库文件会持久保存在Docker命名卷data中,无论执行down/stop/start/up/build等命令,都不会影响数据库内容。
内容的提问来源于stack exchange,提问作者rogaloo
相关产品推荐
相关产品推荐

