Flask部署为docker容器时,如何持久化

329 阅读2分钟

要在使用 Docker 启动的 Flask 应用中保存 SQLite 数据库,你需要确保数据库文件位于一个持久化的存储位置,即使容器停止或重新启动,数据也不会丢失。以下是一些方法来实现这一目标:

方法一:使用 Docker 卷

Docker 卷是用于持久化数据的推荐方式。你可以将 SQLite 数据库文件存储在卷中,以便数据在容器重启后仍然存在。

1. 创建 Docker 卷

首先,创建一个 Docker 卷:

sudo docker volume create flask_db_volume

2. 修改 docker-compose.yml 文件

在你的 docker-compose.yml 文件中,添加卷挂载配置:

version: '3'
services:
  web:
    image: your_flask_image
    ports:
      - "5000:5000"
    volumes:
      - flask_db_volume:/app/data  # 假设数据库文件位于 /app/data 目录

volumes:
  flask_db_volume:

3. 修改 Flask 配置

确保你的 Flask 应用将 SQLite 数据库文件存储在 /app/data 目录中。例如,在你的 Flask 配置文件中:

import os

basedir = os.path.abspath(os.path.dirname(__file__))
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data', 'questions.db')

4. 启动容器

使用 docker-compose 启动容器:

sudo docker-compose up

现在,SQLite 数据库文件将持久化存储在 Docker 卷中。

方法二:使用绑定挂载

你还可以使用绑定挂载,将主机上的一个目录挂载到容器中。

1. 修改 docker-compose.yml 文件

在你的 docker-compose.yml 文件中,添加绑定挂载配置:

version: '3'
services:
  web:
    image: your_flask_image
    ports:
      - "5000:5000"
    volumes:
      - ./data:/app/data  # 假设数据库文件位于 /app/data 目录

volumes:
  flask_db_volume:

这里,./data 是主机上的目录,/app/data 是容器内的目录。

2. 修改 Flask 配置

确保你的 Flask 应用将 SQLite 数据库文件存储在 /app/data 目录中。例如,在你的 Flask 配置文件中:

import os

basedir = os.path.abspath(os.path.dirname(__file__))
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data', 'questions.db')

3. 启动容器

使用 docker-compose 启动容器:

sudo docker-compose up

现在,SQLite 数据库文件将持久化存储在主机的 ./data 目录中。

方法三:手动备份和恢复

如果你不想使用卷或绑定挂载,你可以手动备份和恢复数据库文件。

1. 进入容器

进入容器:

sudo docker exec -it make_video-web-1 sh

2. 复制数据库文件到主机

在容器内找到数据库文件的位置,然后将其复制到主机:

exit  # 退出容器
sudo docker cp make_video-web-1:/app/data/questions.db ./backup/questions.db

3. 恢复数据库文件到容器

如果需要恢复数据库文件到容器:

sudo docker cp ./backup/questions.db make_video-web-1:/app/data/questions.db

通过这些方法,你可以确保 SQLite 数据库在 Docker 容器中持久化存储。推荐使用 Docker 卷或绑定挂载,因为它们更方便、自动化程度更高。