繁体   English   中英

Docker不保留postgres卷[django]

[英]Docker not persisting postgres volume [django]

关于我经历过的类似问题,这里有很多问题要问,例如thisthisthisthis非常相似,但是那里的解决方案都不能解决我的问题。 请不要关闭这个问题。

问题:

我在docker上使用nginx和postgres运行django。 机密信息存储在.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是一个自定义模块,可在应用程序中创建一个超级用户。

此设置不会将信息保留在postgres_data

附加信息:

在做任何事情之前,我先检查使用docker volume ls是否没有名为postgres_data docker volume ls ,然后就可以了。

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

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

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

在这一点上我继续运行docker-compose down / docker-compose stop没问题。 我运行docker volume ls ,它显示postgres_data仍然存在。

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

为了测试一切正常,我运行docker-compose up -d / docker-compose up -d --build / docker-compose start / docker-compose restart

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

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

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

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

具有持久性数据的一种方法是在磁盘上指定实际路径,而不是创建卷:

...
  db:
    image: postgres:11.2-alpine
    volumes:
      - "/local/path/to/postgres/data:/var/lib/postgresql/data/"
...

这样,容器的postgres数据位置将映射到您指定的路径。 这样,除非有意删除数据,否则数据将直接保留在磁盘上。 据我所知,将在删除容器时删除一个docker卷。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM