Saltar al contenido

Cree un superusuario de django en un contenedor de Docker sin ingresar la contraseña

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *