django - Docker 不保留 postgres 卷 [django]

标签 django postgresql docker docker-compose docker-volume

这里有很多关于我遇到的类似问题的问题,例如 this , this , thisthis非常相似,但那里的解决方案都没有解决我的问题。请不要关闭这个问题。

问题:

我在 docker 上运行带有 nginx 和 postgres 的 django。 secret 信息存储在 .env 文件中。我的 postgres 数据没有保留 docker-compose up/startdocker-compose down/stop/restart .

这是我的 docker-compose文件:

version: '3.7'

services:
  web:
    build: ./app
    command: gunicorn umngane_project.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./app/:/usr/src/app/
    expose:
      - 8000
    environment:
      - SECRET_KEY=${SECRET}
      - SQL_ENGINE=django.db.backends.postgresql
      - SQL_DATABASE=postgres
      - SQL_USER=${POSTGRESQLUSER}
      - SQL_PASSWORD=${POSTGRESQLPASSWORD}
      - SQL_HOST=db
      - SQL_PORT=5432
      - SU_NAME=${SU_NAME}
      - SU_EMAIL=${SU_EMAIL}
      - SU_PASSWORD=${SU_PASSWORD}
    depends_on:
      - db
  db:
    image: postgres:11.2-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/app/assets
    ports:
      - 1337:80
    depends_on:
      - web

volumes:
  postgres_data:
    external: true # I tried running without this and the result is the same
  static_volume:

我的入口点脚本是这样的:

python manage.py flush --no-input
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser --user "${SU_NAME}" --email "${SU_EMAIL}" --password "${SU_PASSWORD}"
python manage.py collectstatic --no-input

exec "$@"

哪里createsuperuser是在应用程序中创建 super 用户的自定义模块。

此设置不会保留 postgres_data 中的信息.

附加信息:

在做任何事情之前,我检查一下没有名为 postgres_data 的卷使用 docker volume ls并得到它。

此时我运行 docker-compose up -d/docker-compose up -d --build一切正常,没有错误。

我运行 docker inspect postgres_data它显示"CreatedAt": "X1"

我能够以 super 用户身份登录。我继续创建管理员用户,以 super 用户身份注销,然后以任何管理员用户身份登录都没有问题。我跑 docker exec -it postgres_data psql -U <postgres_user>确保管理员用户在数据库中并找到它。

此时我继续运行 docker-compose down/docker-compose stop没问题。我跑 docker volume ls它表明 postgres_data还在那里。

我运行 docker inspect postgres_data它显示"CreatedAt": "X2"

为了测试一切是否按预期运行,我运行了 docker-compose up -d/docker-compose up -d --build/docker-compose start/docker-compose restart .

我运行 docker inspect postgres_data它显示"CreatedAt": "X3"

此时我继续尝试以管理员用户身份登录,但无法登录。我跑 docker exec -it postgres_data psql -U <postgres_user>再次但这次只看到 super 用户,没有管理员用户。

(说明:我在这里使用正斜杠来显示我在不同尝试中尝试过的所有不同内容。我尝试了此处显示的所有命令组合。)

最佳答案

问题是您在清除数据库的入口点脚本中运行“flush”。每当您启动或重新创建容器时,入口点都会运行。

关于django - Docker 不保留 postgres 卷 [django],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289181/

相关文章:

sql - Postgresql:如何将表导出到单独的 csv 文件中

docker - 如何将镜像组合到Docker中的一个容器中(因为IIB依赖于MQ)?

mysql - 在 OSX 中挂载 Docker 卷时权限被拒绝

docker - 如何通过 yaml list 挂载 docker 容器的卷?

python - 两勺 django 中的 url 模式

django - 我将 Django 与远程 Oracle 数据库一起使用,并收到 "Table does not exist"错误

python - 在我的网络应用程序上使用 ubuntu 字体

python - 使用另一个模型中的行创建 MultipleChoiceField,

sql - 创建索引以加速加入 (1) ids 匹配和 (2) 范围内的日期

sql - 文本数组中的 Postgres 检查约束值的有效性