Docker部署中的数据持久化与权限避坑

数据持久化是Docker部署中最容易被忽视的问题。容器一重启数据就丢?备份时权限报错?这篇讲清楚。

坑1:tar打包权限报错

执行tar -czf backup.tar.gz .报错:

bash
tar: backend/lingxi.db: Permission denied

原因: SQLite数据库文件正在被容器进程占用,文件被锁定,tar没有权限读取。

解决方案:

bash
# 方案一:打包时排除数据库文件(推荐)
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挂载持久化

yaml
# 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管理命令:

bash
# 查看所有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清理无用卷。

posted @ 2026-06-26 16:51  竹雨禅月  阅读(19)  评论(0)    收藏  举报