一尘不染

在Docker容器中创建django超级用户而不输入密码

docker

我正在尝试在具有结构的Django Docker容器中创建createsuperuser。

要在django中创建超级用户,我需要在django交互模式下运行它:

./manage.py createsuperuser

并且因为我想使其在结构脚本中运行,所以我发现 命令可以避免输入密码

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | ./manage.py shell

然后,将其与 “ docker exec” 放在一起,以在我的django容器中运行

docker exec container_django echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | ./manage.py shell

问题出在linux管道上,管道(|)在其左侧的所有内容(包括docker exec)在其右侧(./manage.py shell)

考虑到将所有这些垃圾放入结构中,这不仅是困难的部分,这意味着它们两端都需要加引号。这将使整个事情变得非常紧急。

fabric run:
run("docker exec container_django {command to create django super user}")

我仍在努力如何至少在结构运行中进行垃圾工作,但是我不知道该怎么做。


阅读 618

收藏
2020-06-17

共1个答案

一尘不染

我建议添加一个新的管理命令,如果不存在用户,该命令将自动创建一个超级用户。

查看我在https://github.com/dkarchmer/aws-eb-docker-
django创建的小示例。特别是,请看我如何python manage.py initadmin运行:

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')

(请参阅身份验证/管理/命令)。

您可以看到Dockerfile然后如何仅运行CMD到runserver.sh,该文件基本上可以运行

python manage.py migrate --noinput
python manage.py initadmin
python manage.py runserver 0.0.0.0:8080

显然,这是假定管理员在服务器启动后立即更改密码。这可能对您来说不够好。

2020-06-17