我的应用程序收集数据并将其存储在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文件,而不是在其他地方创建一个卷并在那里保留一个副本?
1条答案
按热度按时间aiazj4mn1#
看起来您可能同时通过Dockerfile中的行将sqlite3 db复制到映像中
COPY . .
在Dockerfile中指定您定义的工作目录
WORKDIR /gcs
和目录结构的外观,可能会将数据库复制到
/gcs/data
以及通过docker-compose文件在
至
/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 docs或this nice summary post,以详细了解卷类型之间的差异。