Здесь было задано много вопросов о подобных проблемах, с которыми я столкнулся, таких как это , это , это и это , которые очень похожи, но ни одно из решений не решает мою проблему. Пожалуйста, не закрывайте этот вопрос.
Проблема:
Я запускаю 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
.
Дополнительная информация:
Прежде чем что-либо делать, я проверяю, нет ли тома с именем postgres_data
, использующего docker volume ls
, и получаю именно это.
В этот момент я запускаю 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>
, но на этот раз вижу только суперпользователя, никаких администраторов.
(Объяснение: я здесь использую косую черту, чтобы показать все разные вещи, которые я пробовал при разных попытках. Я пробовал каждую комбинацию команд, показанных здесь.)