django - 在 Docker 中持久化 Django 的 PostgreSQL 数据库

标签 django postgresql docker-compose

我正在通过尝试创建轮询应用程序来学习 Django described on the Django's website .同时,我是第一次使用 Docker,我在尝试使这个应用程序使用的 PostgreSQL 数据库持久化时遇到了问题。

按照Django使用Docker的提示,找到on the Docker website ,我正在使用 docker-compose 运行两项服务:一项处理数据库,另一项处理应用程序本身(至少我是这样理解的)。我尝试在数据库容器内的/var/lib 目录中安装一个卷,我在其中找到了 PostgreSQL 目录。虽然这个目录变得持久化,我通过创建一些虚拟文件来检查它,但每次我重新启动这些容器时,通过 Web 服务完成的迁移都会被删除。

下面是我的 docker-copmpose.yml 文件和 Django 的 settings.py。我应该怎么做才能使这个数据库持久化?

#docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - .:/code
      - .:/var/lib
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
#(...)
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
#(...)

最佳答案

docker 中的数据持久化可能很棘手,但这里有 2 种可能的解决方案:

  1. 别担心,docker 会搞定的。在您的情况下,由于您使用的是撰写文件,因此只要您不清理卷并且使用“docker-compose down”停止 docker 撰写,就不会有任何问题。一旦您将使用“docker-compose up”,您的数据应该仍在数据库中。
  2. 您想要更多的控制权(并且可能轻松地共享数据)。在这种情况下,您可以选择手动挂载将存储数据的文件。为此,您可以了解更多信息 here (在页面底部)。提示:卷: -/my/own/datadir:/var/lib/postgresql/data

我希望能回答你的问题:)

关于django - 在 Docker 中持久化 Django 的 PostgreSQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328194/

相关文章:

python - 在 Python subprocess.call() 中转义特殊字符 (*)

PostgreSQL 序列化插入交错序列号

java - Docker 编写 Redis 和 Spring boot 应用程序 : java.net.ConnectException : Connection refused (Connection refused)",

mysql - 尝试通过 docker-compose 将 NodeJS 应用程序连接到 MySQL 图像时 ECONNREFUSED

node.js - Docker compose 无法正确复制文件来运行 React 应用程序

django - 类型 'NoneType' 的参数不可使用 ModelForm 进行迭代

python - 为什么我的搜索功能不起作用?

java - 是否可以编写一个 jOOQ 转换器来应用于数组?

postgresql - 在 PostgreSQL 中使用 COPY FROM 加载带有 TIME ZONE 的 NULL TIMESTAMP

python - Django 附加 <queryset> 使用过滤器搜索句子中的每个单词