sqlite 如何在项目文件夹中持久化数据库文件?

at0kjp5o  于 2022-11-24  发布在  SQLite
关注(0)|答案(1)|浏览(132)

我的应用程序收集数据并将其存储在SQLite数据库(位于./data/db.sqlite3)中,我们希望通过Git repo与代码沿着交换该数据库。当我对接应用程序时,数据将在每台机器上保存,但不会保存在项目文件夹本身中。
docker-compose.yml:

version: "3.8"
services:
  gcs:
    build: .
    volumes:
      - type: bind
        source: ./data
        target: /data
    ports:
      - "8000:8000"

Docker文件:

FROM python:3.8-slim-buster

WORKDIR /gcs
COPY requirements.txt requirements.txt
RUN apt-get update && apt-get install nginx vim binutils libproj-dev gdal-bin -y --no-install-recommends
RUN pip3 install -r requirements.txt

COPY . .

CMD python3 manage.py runserver 0.0.0.0:8000

它将项目文件夹中的“data”文件夹挂载到容器中的数据文件夹。当我使用Docker检查源文件夹与项目数据库位置的对应关系时:

"Mounts": [
    {
        "Type": "bind",
        "Source": "/Users/rleblon/projects/gcsproject/data",
        "Destination": "/data",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }

然而,由于某种原因,持久性数据被保存在其他地方,./data/db.sqlite3本身在主机上从未得到更新。
据我所知,Docker会在其他地方创建一个常规卷,并在容器之间共享它,但是当源文件已经复制到容器中时,指定源文件和目标文件有什么意义呢?如何让Docker使用我想要的sqlite3文件,而不是在其他地方创建一个卷并在那里保留一个副本?

aiazj4mn

aiazj4mn1#

看起来您可能同时通过Dockerfile中的行将sqlite3 db复制到映像中
COPY . .
在Dockerfile中指定您定义的工作目录
WORKDIR /gcs
和目录结构的外观,可能会将数据库复制到
/gcs/data
以及通过docker-compose文件在

volumes:
      - type: bind
        source: ./data
        target: /data


/data
在这个映像的运行容器中。
因此,您可能有两个版本的数据在此映像的容器中运行:在
/gcs/data〈--复制到Dockerfile中的图像
/data〈--作为docker-compose中的卷挂载
请确保您没有通过Dockerfile将数据库版本复制到映像中。
如果您的gcs服务与位于/gcs/data中的sqlite3数据库版本交互,而不是与位于/data中的已装入卷交互,则在销毁容器后,对数据库的任何更改都不会持久。
另一方面,如果您的应用程序指向位于/data的数据库的已挂载卷版本,则请确保您的主机/映像上设置的权限允许您执行所需的数据库操作。
请记住,您在合成文件中使用的是绑定挂载-这意味着挂载目录在主机和运行容器之间共享。
As far as I understand Docker simply creates a regular volume elsewhere on my computer and shares that between containers
对于docker卷是如此,但对于您使用的bind挂载类型则不然。例如,请参见offical docsthis nice summary post,以详细了解卷类型之间的差异。

相关问题