Docker部署中的数据持久化与权限避坑
数据持久化是Docker部署中最容易被忽视的问题。容器一重启数据就丢?备份时权限报错?这篇讲清楚。
坑1:tar打包权限报错
执行tar -czf backup.tar.gz .报错:
tar: backend/lingxi.db: Permission denied
原因: SQLite数据库文件正在被容器进程占用,文件被锁定,tar没有权限读取。
解决方案:
# 方案一:打包时排除数据库文件(推荐)
tar -czf backup.tar.gz --exclude=backend/lingxi.db .
# 方案二:先停容器再打包
docker-compose down
tar -czf backup.tar.gz .
docker-compose up -d
# 方案三:用docker exec在容器内备份
docker exec -it lingxi-backend sqlite3 /app/persist/lingxi.db ".backup /app/persist/backup.db"
坑2:容器重启后数据丢失
容器重启后,发现所有数据都没了——会议记录、用户反馈全部清空。
原因: Docker容器本身是无状态的,重启后容器内的文件系统重置。数据存在容器内部,但没有挂载到宿主机。
解决方案:volume挂载持久化
# docker-compose.yml
services:
backend:
image: lingxi-backend
volumes:
- lingxi-db:/app/persist # 持久化数据库
environment:
- DATABASE_URL=sqlite:////app/persist/lingxi.db
volumes:
lingxi-db: # 声明volume
首次启动时Docker会自动创建volume,数据会保存在/var/lib/docker/volumes/lingxi-db/_data。容器删除重建后,只要volume还在,数据就不会丢。
常用volume管理命令:
# 查看所有volume
docker volume ls
# 查看某个volume的挂载位置
docker volume inspect lingxi-db
# 备份volume数据
docker run --rm -v lingxi-db:/data -v $(pwd):/backup alpine tar -czf /backup/lingxi-db-backup.tar.gz -C /data .
# 恢复volume数据
docker run --rm -v lingxi-db:/data -v $(pwd):/backup alpine tar -xzf /backup/lingxi-db-backup.tar.gz -C /data
踩坑总结:
-
数据库文件、用户上传文件必须用volume挂载,否则容器重启即丢失。
-
备份时数据库文件可能被锁定,要么先停容器,要么用
docker exec在容器内备份。 -
部署脚本里不要直接
rm -rf覆盖volume,用docker volume prune清理无用卷。

浙公网安备 33010602011771号