Докер не сохранил том postgres [django] - PullRequest
1 голос
/ 22 марта 2019

Здесь было задано много вопросов о подобных проблемах, с которыми я столкнулся, таких как это , это , это и это , которые очень похожи, но ни одно из решений не решает мою проблему. Пожалуйста, не закрывайте этот вопрос.

Проблема:

Я запускаю 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>, но на этот раз вижу только суперпользователя, никаких администраторов.

(Объяснение: я здесь использую косую черту, чтобы показать все разные вещи, которые я пробовал при разных попытках. Я пробовал каждую комбинацию команд, показанных здесь.)

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Проблема в том, что вы запускаете «flush» в своем скрипте точки входа, который очищает базу данных.Точка входа будет работать всякий раз, когда вы загружаете или воссоздаете контейнер.

1 голос
/ 22 марта 2019

Одним из способов получения постоянных данных является указание фактического пути на диске вместо создания тома:

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

Таким образом, местоположение данных postgres контейнера сопоставляется с указанным вами путем.Таким образом, данные сохраняются непосредственно на диске, если намеренно не удален.Том докера, насколько я знаю, будет удален при удалении контейнера.

...