在Docker容器中创builddjango超级用户而不input密码

我打算创build超级用户在Django泊坞窗容器与织物。

要在django中创build超级用户,我需要以django交互模式运行这个工具:

./manage.py createsuperuser 

而且因为我想让它运行在结构脚本中,所以我觉得这个命令可以避免input密码

 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 

问题出现在它的左边(包括docker exec)的pipe道(|)pipe道(|)的右边(./ manage.py shell)

这不仅是困难的一部分,考虑把所有这些垃圾放到一个织物运行,这意味着他们需要两端引号。 它会使整个事情非常丑陋。

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

我仍然在努力如何至less在一个面料运行垃圾工作,但我不知道该怎么做。

我build议添加一个新的pipe理命令,如果没有用户存在,将自动创build一个超级用户。

看到我在https://github.com/dkarchmer/aws-eb-docker-django创build的小例子。 特别是,看看我有一个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') 

(请参阅authentication/pipe理/命令)。

你可以看到Dockerfile是如何运行CMD到基本运行的runserver.sh的

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

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

我通过评估Dockerfile中的python代码行来处理这个问题。

 ENV DJANGO_DB_NAME=default ENV DJANGO_SU_NAME=admin ENV DJANGO_SU_EMAIL=admin@my.company 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')" 

请注意,这与调用不同

 User.objects.create_superuser('admin', 'admin@example.com', 'pass') 

因为django.contrib.auth.get_user_model可以在自定义用户模型下正常工作,如果您有任何(这很常见),而User.objects.create只创build一个标准用户实体,忽略任何自定义用户模型。

另外,django的createsuperuser命令也是一样的 ,所以应该很安全。

可能最简单的方法就是将Python脚本放在一起,为您创buildDjango超级用户,而不是试图通过manage.py shell来提供所有这些命令。 你可以把你的命令放在一个.py文件中,让我们说你的文件.py:

 #!/usr/bin/env python from django.contrib.auth.models import User User.objects.create_superuser('admin', 'admin@example.com', 'pass') 

然后,在做chmod +x yourfile.py

 fabric run: run("docker exec container_django yourfile.py") 

根据您的设置,您可能需要确保为该run()命令适当地设置了DJANGO_SETTINGS_MODULE环境variables。

我拿@ Hoefling的答案 ,并改变了一点。

我需要在构build步骤之后创build超级用户。 所以我把它放在一个主pipe脚本里面。 这意味着每次运行容器时都会执行它。 所以我添加了一个简单的if / else控件来检查是否已经创build了超级用户。 这减less了执行时间。 我们还需要设置DJANGO_SETTINGS_MODULE环境variables。

 python -c "import os os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.settings' import django django.setup() from django.contrib.auth.management.commands.createsuperuser import get_user_model if get_user_model().objects.filter(username='$DJANGO_SUPERUSER_USERNAME'): print 'Super user already exists. SKIPPING...' else: print 'Creating super user...' get_user_model()._default_manager.db_manager('$DJANGO_DB_NAME').create_superuser(username='$DJANGO_SUPERUSER_USERNAME', email='$DJANGO_SUPERUSER_EMAIL', password='$DJANGO_SUPERUSER_PASSWORD') print 'Super user created...'"