当前位置: 首页 > news >正文

Docker 容器内 SQLite 数据持久化怎么正确挂载卷

对于 Docker 容器内的 SQLite 数据持久化,最稳妥的方式是通过挂载数据卷(Volume)或绑定挂载(Bind Mount)将数据库文件所在目录映射到宿主机,确保容器删除后文件依然保留。

先说结论:SQLite 是文件型数据库,必须把存文件的目录挂载出来,否则容器一删数据就没了。

  • 适合:所有需要保留数据的 Docker 化 SQLite 应用,开发环境推荐绑定挂载,生产环境推荐命名卷。
  • 先准备:确认容器内 SQLite 数据库文件的实际存储路径,提前规划宿主机挂载点。
  • 验收:容器删除重建后,检查数据库文件是否存在且数据可读写。

命令速用版

# 方式一:使用 Docker 管理卷(推荐生产环境)
docker volume create my-sqlite-data
docker run -d `--name` my-app `--mount` source=my-sqlite-data,target=/app/data my-image# 方式二:绑定挂载宿主机目录(推荐开发环境)
docker run -d `--name` my-app -v /host/path/to/data:/app/data my-image

为什么会这样

Docker 容器默认是“无状态”的,容器内部 writable layer(可写层)的数据会随着容器删除而消失。SQLite 的本质是一个或多个文件(如 .db 文件),如果这些文件只存在于容器内部路径,容器销毁后文件也就丢失了。

通过挂载卷(Volume)或绑定挂载(Bind Mount),我们将容器内的数据库目录映射到了宿主机文件系统。这样即使容器被删除,数据依然安全地保存在宿主机上,新容器挂载同一位置即可继续读写。

分步处理

1. 确认数据库文件路径

首先需要知道你的应用在容器内把 SQLite 文件存在哪。常见路径如 /app/data/var/lib/sqlite 或应用配置指定的绝对路径。如果不确定,可以进入容器查看:

docker exec -it <容器名> find / -name "*.db"

2. 创建挂载点

如果使用 Docker 卷,先创建卷:

docker volume create my-app-db

如果使用绑定挂载,确保宿主机目录存在(可选,Docker 通常会自动创建,但权限可能不可控):

mkdir -p /opt/my-app/data

3. 启动容器并挂载

运行容器时加上挂载参数。注意 target 必须是容器内存放数据库文件的目录,而不是单个文件(除非该文件已存在)。

# 使用卷
docker run -d `--name` my-app `--mount` source=my-app-db,target=/app/data my-image# 使用绑定挂载
docker run -d `--name` my-app -v /opt/my-app/data:/app/data my-image

怎么验证是否生效

1. 写入测试数据

进入容器,使用 sqlite3 命令插入一条测试数据:

docker exec -it my-app sqlite3 /app/data/test.db "INSERT INTO users VALUES (1, 'test');"

2. 删除并重建容器

停止并删除当前容器,然后用相同的挂载参数启动一个新容器(名字可以不同):

docker rm -f my-app
docker run -d `--name` my-app-new `--mount` source=my-app-db,target=/app/data my-image

3. 检查数据

进入新容器查询刚才插入的数据,如果能查到,说明持久化成功:

docker exec -it my-app-new sqlite3 /app/data/test.db "SELECT * FROM users;"

常见坑

1. 挂载文件还是目录

尽量挂载目录而不是单个文件。如果宿主机上对应的文件不存在,Docker 可能会将其创建为目录,导致容器内应用无法打开数据库文件报错。

2. 权限问题

绑定挂载时,宿主机目录的权限可能与容器内运行用户的 UID/GID 不匹配,导致 SQLite 无法写入。如果遇到 Permission denied,检查宿主机目录权限:

ls -l /opt/my-app/data

3. 并发锁风险

SQLite 对文件锁敏感。不要让多个容器同时挂载同一个 SQLite 文件进行写操作,这会导致数据库锁定错误。如果需要多容器访问,建议改用客户端 - 服务器架构的数据库(如 PostgreSQL)。

4. 路径混淆

分清 src/source 是宿主机路径或卷名,target/dst 是容器内路径。写反了会导致数据存错地方或容器启动失败。

参考来源

  • Docker 持久化 SQLite 数据库文件
  • 五、Docker 核心技术:容器数据持久化之数据卷
  • 通过挂载 Docker 卷实现数据持久化及 volume 命令详解 - 开发者社区 - 阿里云
  • Docker 数据管理:卷、挂载和持久化,保障容器环境数据安全

原文链接:https://www.zjcp.cc/ask/10821.html

http://www.jsqmd.com/news/794917/

相关文章:

  • AI大模型竞品Anthropic Claude Opus 4.7深度分析
  • Blender 3MF插件:3D打印设计的终极解决方案
  • 军事预防医学考研辅导班推荐:专门针对性培训机构评测 - michalwang
  • 172 号卡邀请码是多少?2026 年 5 月官方唯一有效码 - 资讯焦点
  • 泓动数据官网是哪个?联系方式多少?www.hongdongshuju.com(商务对接认准泓动数据总部唯一官网) - 速递信息
  • 从零构建可验证KG系统:奇点大会现场演示的6大自动化验证工具链与37项合规性指标
  • 服了,程序员就不配谈女朋友?
  • 采煤机截割曲线畸变连续调节补偿技术【附仿真】
  • 5步轻松实现老旧电视秒变智能直播中心:MyTV-Android终极指南
  • Function Calling vs MCP:AI工具生态的架构演进与选型指南2026
  • 高端不锈钢装饰材料的微观晶体结构与表面物理改性技术白皮书 - 资讯焦点
  • 推荐两江新区不错的旧房翻新装修设计,效果巴适质量过硬且负责又有性价比 - 大渝测评
  • 基于WebAssembly的高效SQLite数据库在线解析方案
  • 穿透 MQ 专栏 (三):【幂等防御】“网卡了一下,用户被扣了两次钱?”:如何防住防不胜防的重复消费
  • 总线概述
  • C++ / MFC / Qt / C# 核心知识点汇总笔记
  • 2026年五大听书软件横评,QQ阅读、书尖AI 一篇说清楚 - 资讯焦点
  • 鸣潮终极解放指南:如何用ok-ww后台自动化工具每天节省2小时游戏时间
  • 如何突破《原神》60帧限制:终极帧率解锁完全指南
  • 2026上海GEO优化公司:制造业、服务业、化工行业GEO优化公司推荐 - 资讯焦点
  • 手把手教你搭建专属 AI 助手|hermes agent 2 分钟极速部署指南! - 博客万
  • 从蛋白质分类到社交网络:Graph Pooling在实际项目里到底怎么用?
  • 终极指南:3分钟解锁网易云音乐NCM加密文件,纯C语言工具一键转换
  • RasaGPT:融合Rasa与GPT构建智能对话机器人的工程实践
  • 八大网盘直链下载终极指南:免费获取真实下载地址的完整解决方案
  • BetterNCM安装器:3分钟让网易云音乐焕然一新
  • 从踩坑到逆袭:我如何找到靠谱有实力的企业IP打造服务商
  • Stacking集成学习避坑指南:为什么你的模型融合后效果反而变差了?
  • 5.4-5.10 补题
  • LLM上下文窗口工程2026:超长文档处理的实战策略完全指南