Как создать Django-суперпользователя внутри Docker

Имеется сервер, запускающийся через docker-compose. Нужно перед запуском сервера создать суперпользователя, чтобы можно было зайти в админку. Как это можно сделать?


Ответы (3 шт):

Автор решения: mymedia

Отредактируйте Dockerfile, добавив туда вызов createsuperuser с переменными окружения.

RUN DJANGO_SUPERUSER_PASSWORD=Tr0ub4dor@3 python manage.py createsuperuser --noinput administator
→ Ссылка
Автор решения: Roman Konoval

Если нужно вручную создавать, то такой командой:

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.")
→ Ссылка