如何将SQLite3数据库挂载到Django和Docker容器中?

13

我在本地主机上有一个带有某些表格的SQLite数据库,我想将该数据库复制粘贴到运行在Docker上的服务器中。我创建了以下路径:

enter image description here

db_data:这是我想在Django项目中运行的SQLite数据库。 web:这是我的整个Django项目。

在我的docker-compose.yml文件中,我填写了这个卷:

version: "3"

services:

  web:
    build: ./web/
    ports:
      - "8001:8001"
    volumes:
      - ./web:/code
      - /home/cosmo/db_data/db.sqlite3:/code/db.sqlite3
    command: python manage.py runserver 0.0.0.0:8001

所以我认为Docker将获取我的db_data中的数据库,并在我的Web文件夹(在我的项目中)内创建卷。 在那里,我本地主机上有数据库,所以这不会成为问题。但是我会在这里粘贴settings.py

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

当我打开db_data文件夹中的db.sqlite3时,里面有所有的表和内容。但是当我运行容器后,我在项目文件夹(web)中的db.sqlite3是空的。

当我运行docker ps命令时,没有数据库容器,也许这就是问题所在,我不知道。我只有以下内容:

enter image description here

红圈里是我的django容器。因此,当我运行服务器并尝试登录时,来自数据库的每个帐户都是未知的。所以我认为容器正在使用我项目中的空数据库。请问有人有解决方案吗?谢谢。


1
像这样使用sqlite听起来不是一个好主意。为什么不在另一个容器中使用一个适当的数据库 - Postgres或MySQL呢? - Daniel Roseman
1
因为我已经将所有数据存储在那里,迁移到另一个数据库会非常痛苦。而且我已经为此设置了一切。我知道所有的教程都是针对Postgres的,但我想自己解决这个问题。 - idature
1
你需要将数据库添加到一个卷中,或者将其烧录到镜像中。 - jrtapsell
而且它不在卷中? - idature
2
@Idature,你解决问题了吗? @jrtapsell,如果我想检查样本POC工作的相同事情,你能告诉我解决方案是什么吗? - Prasad Shinde
1
SQLite 没有问题,但不要将数据库复制到容器中,只需映射一个卷,否则当容器关闭时,您的数据库将消失! - michjnich
1个回答

4
  1. BASE_DIR将是设置文件所在文件夹,通常在根目录的一个文件夹中。因此,您可能有一个目录问题。如果您可以直接将文件移动到与settings.py相同的文件夹中,那么您至少可以消除这些变量。
  2. 您不会看到一个容器,它只是绑定了一个卷,您应该使其独特,因此不要像/code/db.sqlite3一样嵌套它,而是将其放在自己的文件夹中,然后您可以在设置文件中引用它。您可以使用docker volume ls(假设Docker 1.8+)查看卷列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接