У меня есть следующий 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