Docker未持久化postgres卷[django]

Docker未持久化postgres卷[django],django,postgresql,docker,docker-compose,docker-volume,Django,Postgresql,Docker,Docker Compose,Docker Volume,这里有很多关于我经历过的类似问题的问题,比如,非常相似,但没有一个解决方案能解决我的问题。请不要结束这个问题 问题: 我在docker上用nginx和postgres运行django。机密信息存储在.env文件中。我的postgres数据在docker compose up/start和docker compose down/stop/restart中没有持久化 这是我的docker compose文件: version: '3.7' services: web: build: .

这里有很多关于我经历过的类似问题的问题,比如,非常相似,但没有一个解决方案能解决我的问题。请不要结束这个问题

问题: 我在docker上用nginx和postgres运行django。机密信息存储在.env文件中。我的postgres数据在
docker compose up/start
docker 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\u数据中保存信息

其他信息: 在做任何事情之前,我使用
docker volume ls
检查是否没有名为
postgres\u data
的卷,然后得到它

在这一点上,我运行
docker compose up-d
/
docker compose up-d--build
,一切正常,没有错误

我运行docker inspect postgres_data,它显示了“CreatedAt”:“X1”

我可以作为超级用户登录。我继续创建管理员用户,以超级用户身份注销,然后以任何管理员用户身份登录,没有问题。我运行了
docker exec-it postgres\U data psql-U
,以确保管理员用户在数据库中并找到它

在这一点上,我继续运行
docker compose down
/
docker compose stop
,没有问题。我运行了
docker volume ls
,它显示
postgres\u数据仍然存在

我运行了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\U data psql-U
,但这次只看到超级用户,没有管理员用户


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

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

...
  db:
    image: postgres:11.2-alpine
    volumes:
      - "/local/path/to/postgres/data:/var/lib/postgresql/data/"
...
这样,容器的postgres数据位置将映射到您指定的路径。这样,除非有意删除,否则数据将直接保存在磁盘上。
据我所知,一个docker卷将在移除容器时被移除。

问题是您在入口点脚本中运行“flush”以清除数据库。无论何时启动或重新创建容器,入口点都将运行。

入口点中有“python manage.py flush--无输入”。每次容器重新创建时,都会运行并删除所有数据。让我知道这是否解决了你的问题,我会从中找到答案。不要只放“postgres_数据”,而是把你主机的整个路径放在解决我问题的“postgres_数据”上problem@FelipeToledo如果我理解正确的话,你是说我应该创建一个本地路径,正如@Bogsan?@dot64dot给出的答案一样-添加我的评论作为答案。这有什么安全含义?如果我在服务器上启动系统,这是否意味着我将有一个额外的故障点?就我而言,只要对服务器的访问受到保护,这种方式与使用卷之间应该没有任何区别。对您的计算机具有访问权限的攻击者将能够像访问容器一样读取数据库文件夹。一句话,我认为这和你最初的方法一样安全,使用量大。谢谢你的详细回复,非常感谢