这里有很多类似我遇到问题的提问,例如这个、这个、这个和这个。虽然它们非常相似,但没有一个解决我的问题。请不要关闭这个问题。
问题:
我使用docker运行django、nginx和postgres,并将机密信息存储在.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_data
中。
额外信息:
在执行任何操作之前,我使用 docker volume ls
检查是否存在名为 postgres_data
的卷,确保不存在。
接下来,我运行 docker-compose up -d
/docker-compose up -d --build
,一切都正常且没有错误发生。
然后我运行 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
仍然存在。
我又运行 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>
,但这一次只看到超级用户,没有管理员用户。
(说明:我在这里使用正斜杠来显示我在不同尝试中尝试的所有不同命令组合。我尝试了这里显示的每种命令组合。)