Как создать Django-суперпользователя внутри Docker
Имеется сервер, запускающийся через docker-compose. Нужно перед запуском сервера создать суперпользователя, чтобы можно было зайти в админку. Как это можно сделать?
Ответы (3 шт):
Отредактируйте Dockerfile, добавив туда вызов createsuperuser с переменными окружения.
RUN DJANGO_SUPERUSER_PASSWORD=Tr0ub4dor@3 python manage.py createsuperuser --noinput administator
Если нужно вручную создавать, то такой командой:
docker-compose exec -ti service-name python manage.py createsuperuser
Тут service-name имя сервиса, как оно указано в docker-compose.yml файле.
Если нужно это делать перед стартом сервера, то нужно это делать с помощью опции command в определении сервиса. Допустим у вас сейчас сервис типа такого:
services:
myapp:
build: .
command: gunicorn my.wsgi:application --settings=my.settings.conf
Тогда можно добавить команду:
services:
myapp:
build: .
environement:
- DJANGO_SUPERUSER_PASSWORD=$DJANGO_SUPERUSER_PASSWORD
command: python manage.py createsuperuser && gunicorn my.wsgi:application --settings=my.settings.conf
Пароль для пользователя можно передать установив переменную окружения DJANGO_SUPERUSER_PASSWORD перед запуском docker-compose up.
Я использовал сигнал post_migrate, так как каждый раз при запуске контейнера делаю:
python manage.py migrate
signals.py:
import os
from django.contrib.auth import get_user_model
from django.db.models.signals import post_migrate
from django.dispatch import receiver
@receiver(post_migrate)
def create_superuser(sender, **kwargs):
if sender.name == 'scripts':
User = get_user_model()
if not User.objects.filter(username='admin').exists():
User.objects.create_superuser(
username=os.environ.get('DJANGO_SUPERUSER_USERNAME', 'admin'),
email=os.environ.get('DJANGO_SUPERUSER_EMAIL', '[email protected]'),
password=os.environ.get('DJANGO_SUPERUSER_PASSWORD', '12345'),
)
print("Superuser created.")
else:
print("Superuser already exists.")