Solución:
Obtenga el ID del contenedor y ejecute el comando.
docker exec -it container_id python manage.py createsuperuser
Recomiendo agregar un nuevo comando de administración que creará automáticamente un superusuario si no existen usuarios.
Vea un pequeño ejemplo que creé en https://github.com/dkarchmer/aws-eb-docker-django. En particular, mira cómo tengo un python manage.py initadmin
la cual recorre:
class Command(BaseCommand):
def handle(self, *args, **options):
if Account.objects.count() == 0:
for user in settings.ADMINS:
username = user[0].replace(' ', '')
email = user[1]
password = 'admin'
print('Creating account for %s (%s)' % (username, email))
admin = Account.objects.create_superuser(email=email, username=username, password=password)
admin.is_active = True
admin.is_admin = True
admin.save()
else:
print('Admin accounts can only be initialized if no Accounts exist')
(Ver Autenticación / administración / comandos).
Puede ver cómo el Dockerfile luego simplemente ejecuta CMD en runserver.sh que básicamente se ejecuta
python manage.py migrate --noinput
python manage.py initadmin
python manage.py runserver 0.0.0.0:8080
Obviamente, esto supone que los administradores cambian inmediatamente sus contraseñas después de que el servidor está activo. Eso puede o no ser lo suficientemente bueno para ti.
Descargo de responsabilidad:
El almacenamiento de las contraseñas en texto sin formato en el Dockerfile no es seguro, ya que las contraseñas se pueden extraer de la imagen en cualquier momento y los Dockerfiles suelen estar comprometidos con el control de versiones. Sin embargo, esta respuesta no se trata de la seguridad de la contraseña, sino de la automatización de la createsuperuser
mando; Si está buscando una forma adecuada de almacenar la contraseña de superusuario, eche un vistazo a esta pregunta SO: Docker y protección de contraseñas.
Manejo esto evaluando la línea de código de Python en Dockerfile.
ENV DJANGO_DB_NAME=default
ENV DJANGO_SU_NAME=admin
ENV [email protected]
ENV DJANGO_SU_PASSWORD=mypass
RUN python -c "import django; django.setup();
from django.contrib.auth.management.commands.createsuperuser import get_user_model;
get_user_model()._default_manager.db_manager('$DJANGO_DB_NAME').create_superuser(
username="$DJANGO_SU_NAME",
email="$DJANGO_SU_EMAIL",
password='$DJANGO_SU_PASSWORD')"
Tenga en cuenta que esto es diferente a llamar
User.objects.create_superuser('admin', '[email protected]', 'pass')
como django.contrib.auth.get_user_model
funcionará bien con el modelo de usuario personalizado si debe tener alguno (que es bastante común), mientras que con User.objects.create
solo crea una entidad de usuario estándar, ignorando cualquier modelo de usuario personalizado.
Además, es la misma llamada que django’s createsuperuser
comando lo hace debajo del capó, por lo que debería ser bastante seguro hacerlo.