Docker потеря Postgres данных сервера, когда я выключаю бэкэнд-контейнер - PullRequest
1 голос
/ 27 апреля 2020

У меня есть следующий docker -компонентный файл, и он отлично обслуживает приложение на порту 80.

version: '3'

services:
    backend:
        build: ./Django-Backend
        command: gunicorn testing.wsgi:application --bind 0.0.0.0:8000 --log-level debug
        expose:
            - "8000"
        volumes:
            - static:/code/backend/static
        env_file:
            - ./.env.prod

    nginx:
        build: ./nginx
        ports:
            - 80:80
        volumes:
            - static:/static
        depends_on:
            - backend

    db:
        image: postgres
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        volumes:
            - postgres_data:/var/lib/postgresql/data/

volumes:
    static:
    postgres_data:

Оказавшись там, я могу войти в администратор и добавить дополнительного пользователя, который будет сохранен в базе данных, поскольку я могу перезагрузить страницу, и пользователь все еще там. Как только я остановлю контейнер backend docker, этот пользователь исчезнет. Учитывая, что Postgres работает в другом контейнере, и я не отключаю его, я не уверен, что остановка внутреннего контейнера и перезапуск его приводят к недоступности данных.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Я поднимаю контейнер docker с помощью следующей команды.

docker-compose -f docker-compose.prod.yml up -d

Я снимаю контейнер, просто используя docker рабочий стол и останавливая контейнер.

Я использую DJANGO 3 для бэкэнда, и я также попытался добавить суперпользователя в терминал при работе контейнера:

# python manage.py createsuperuser 
Username (leave blank to use 'root'): mikey
Email address: 
Password: 
Password (again): 
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

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

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

settings.py using dotenv "из dotenv import load_dotenv "

DATABASES = {
    "default": {
        "ENGINE": os.getenv("SQL_ENGINE"),
        "NAME": os.getenv("SQL_DATABASE"),
        "USER": os.getenv("SQL_USER"),
        "PASSWORD": os.getenv("SQL_PASSWORD"),
        "HOST": os.getenv("SQL_HOST"),
        "PORT": os.getenv("SQL_PORT"),
    }
}

с файлом .env.prod, имеющим следующие значения:

DEBUG=0
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=postgres
SQL_USER=postgres
SQL_PASSWORD=postgres
SQL_HOST=db
SQL_PORT=5432

РЕШЕНИЕ:

Прочитайте комментарии, чтобы увидеть диагноз по другие легенды, но обновленный docker -композитный файл выглядит следующим образом. Обратите внимание на блок «depen_on».

version: '3'

services:
    backend:
        build: ./Django-Backend
        command: gunicorn testing.wsgi:application --bind 0.0.0.0:8000 --log-level debug
        expose:
            - "8000"
        volumes:
            - static:/code/backend/static
        env_file:
            - ./.env.prod
        depends_on:
            - db

    nginx:
        build: ./nginx
        ports:
            - 80:80
        volumes:
            - static:/static
        depends_on:
            - backend

    db:
        image: postgres
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        expose:
            - "5432"

volumes:
    static:
    postgres_data:

ФИНАЛЬНОЕ РЕДАКТИРОВАНИЕ:

Добавил следующий код в мою точку входа. sh файл, чтобы Postgres был готов к приему подключений бэкэндом контейнер.

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...