You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器中Flask应用读写主机SQLite数据库配置方法

如何让Docker容器内的Flask应用读写主机上的SQLite数据库?

我来帮你搞定这个问题!要让Docker里的Flask应用读写主机上的SQLite数据库,核心是用Docker的**绑定挂载(Bind Mount)**把主机的数据库文件/目录映射到容器内,再调整应用的连接路径,同时注意权限问题。下面是具体步骤:

1. 迁移容器内的SQLite数据库到主机(可选)

如果你的应用已经有容器内的数据库数据,先把它拷贝到主机:

# 替换<容器名/ID>和容器内的数据库路径,以及主机的目标路径
docker cp <容器名或ID>:/path/to/container/db.sqlite3 /host/path/to/save/db-directory/db.sqlite3

如果是全新数据库,直接在主机创建即可:

sqlite3 /host/path/to/db-directory/db.sqlite3

2. 修改Flask应用的数据库连接配置

根据你使用的数据库访问方式调整路径:

  • 如果用SQLAlchemy:修改SQLALCHEMY_DATABASE_URI为容器内的挂载路径(注意SQLite绝对路径需要4个斜杠):
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////app/db-directory/db.sqlite3'
    
  • 如果直接用sqlite3模块:连接路径设为容器内的挂载路径:
    conn = sqlite3.connect('/app/db-directory/db.sqlite3')
    

3. 配置Docker挂载主机数据库路径

你可以用命令行或Docker Compose两种方式实现:

命令行方式

运行容器时通过-v参数挂载主机目录到容器内:

# 替换主机路径、容器内路径和你的镜像名
docker run -d -p 5000:5000 -v /host/path/to/db-directory:/app/db-directory your-flask-image

小贴士:推荐挂载目录而非单个文件,因为SQLite会生成db.sqlite3-journal这类临时文件,挂载目录能避免权限或文件缺失问题。

Docker Compose方式

docker-compose.yml中添加volumes配置:

version: '3.8'
services:
  flask-app:
    build: .
    ports:
      - "5000:5000"
    volumes:
      # 主机路径:容器内路径
      - /host/path/to/db-directory:/app/db-directory

4. 解决权限问题(关键!)

默认情况下Docker容器以root用户运行,可能会修改主机数据库文件的权限,导致主机用户无法访问,甚至容器内进程没有读写权限。可以这样处理:

方法一:在Dockerfile中创建非root用户

先在Dockerfile里添加创建用户的命令(替换1000为你主机用户的UID,用id -u命令查看):

# 创建普通用户,UID和主机用户一致
RUN useradd -m -u 1000 flask-user
# 切换到该用户运行应用
USER flask-user

然后修改主机数据库目录的权限:

chown -R 1000:1000 /host/path/to/db-directory

方法二:运行容器时指定用户

直接在运行命令中指定主机用户的UID/GID:

docker run -d -p 5000:5000 -v /host/path/to/db-directory:/app/db-directory --user $(id -u):$(id -g) your-flask-image

5. 验证配置是否生效

启动容器后,在Flask应用中执行读写操作(比如添加一条测试数据),然后在主机上用SQLite命令行查看数据:

sqlite3 /host/path/to/db-directory/db.sqlite3
# 执行查询语句验证
SELECT * FROM your_table;

反之,在主机修改数据库数据,容器内的Flask应用也应该能读取到最新内容。

注意事项

  • SQLite是单文件数据库,不要让多个容器同时读写同一个数据库文件,会导致数据损坏。如果你的Flask应用需要多实例部署,建议改用MySQL、PostgreSQL等客户端-服务器型数据库。
  • Windows主机用户注意路径格式:如果用WSL2,直接用Linux风格路径;如果用原生Docker Desktop,路径类似/c/Users/YourName/db-directory:/app/db-directory

内容的提问来源于stack exchange,提问作者ronmorg

火山引擎 最新活动