You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中SQLite数据无法持久化到主机的解决方法

解决Docker Compose部署SQLite应用的数据持久化问题

要解决SQLite数据仅存在容器内部的问题,核心是通过Docker卷挂载将容器内存储SQLite数据库文件的目录映射到宿主机目录,确保容器重启或销毁后数据依然保存在宿主机上。

步骤1:确认应用内SQLite文件的路径

先明确你的Node.js应用中SQLite数据库文件的存储路径,比如常见的:

  • 项目根目录下的./database/db.sqlite
  • 或./data/db.sqlite

你可以在数据库连接代码里找到这个路径,示例:

const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./database/db.sqlite'); // 这里的路径就是容器内的目标路径

步骤2:修改Docker Compose配置文件

在docker-compose.yml中,给应用服务添加volumes配置,将宿主机目录(比如当前项目下的./docker-data)挂载到容器内存储SQLite文件的目录。

示例配置:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      # 格式:宿主机目录:容器内数据库文件所在目录
      - ./docker-data:/app/database
    # 其他配置(如环境变量、命令等)...

关键注意事项:

  • 宿主机的docker-data目录建议手动创建,避免Docker自动创建时出现权限问题
  • 容器内的路径必须和应用中SQLite文件的路径完全匹配(比如应用用./database/db.sqlite,容器内工作目录是/app,则容器内路径为/app/database)

步骤3:处理权限问题(可选)

如果挂载后出现SQLite无法写入的权限错误,大概率是宿主机目录权限和容器内运行应用的用户不匹配:

  • 测试阶段可临时设置宿主机目录权限:chmod 777 ./docker-data(生产环境建议使用更严格的权限控制)
  • 或在Dockerfile中指定运行应用的用户,并确保该用户拥有容器内数据库目录的读写权限:
RUN mkdir -p /app/database && chown -R node:node /app/database
USER node

步骤4:验证持久化效果

  1. 停止并删除现有容器:docker-compose down
  2. 重新启动服务:docker-compose up -d
  3. 在应用中创建一条用户记录
  4. 停止容器:docker-compose stop
  5. 重新启动容器:docker-compose start
  6. 检查用户记录是否保留,同时查看宿主机docker-data目录下是否生成了db.sqlite文件

完成以上配置后,SQLite数据库文件会持久化存储在宿主机目录中,容器的生命周期不再影响数据留存。

内容的提问来源于stack exchange,提问作者Kyle Corbin Hurst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:09