2015-05-04 20 views
7

我打算在具有結構的django碼頭集裝箱中創建超級用戶。在沒有輸入密碼的情況下在碼頭集裝箱中創建django超級用戶

要在Django的超級用戶,我需要一個Django交互模式運行這個:

./manage.py createsuperuser 

而且因爲我想讓它在織物腳本運行,所以我覺得this命令能夠避免輸入查詢密碼

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'pass')" | ./manage.py shell 

然後,我「泊塢窗EXEC」把這個一起在我的Django的容器中運行它

docker exec container_django echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'pass')" | ./manage.py shell 

的問題出來了Linux管材,管件(|)都在其左側(包括泊塢窗Exec),將其右側(./ manage.py殼)的內容

而且這不僅是考慮將所有這些垃圾放入布料運行中,這意味着它們需要兩端引號。它會使整個事情非常醜陋。

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

我仍然在努力就如何使至少在織物運行垃圾的工作,但我不知道該怎麼做。

回答

1

可能最簡單的方法是將Python腳本放在一起爲您創建Django超級用戶,而不是試圖通過manage.py shell來提供所有這些命令。你可以把你的命令在一個.py文件,比方說yourfile.py

#!/usr/bin/env python 

from django.contrib.auth.models import User 
User.objects.create_superuser('admin', '[email protected]', 'pass') 

,然後做chmod +x yourfile.py後:

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

根據您的設置,您可能需要確保的是, DJANGO_SETTINGS_MODULE環境變量爲該run()命令適當設置。

+0

我選擇這個解決方案將Hashicorp Vault添加到混合中,只是爲了讓祕密對攻擊者保持祕密。簡單地說,不是傳遞密碼(也可能是用戶名),而是向保險櫃查詢密鑰。 – Ikon

4

我建議添加一個新的管理命令,如果沒有Users,則會自動創建一個超級用戶。

查看我在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 

顯然,這種假設管理員立即去更改自己的密碼後,服務器啓動。這對你來說可能會或可能不夠好。

+0

請注意,您也可以使用'docker run --rm python manage.py initadmin'手動運行initadmin,這很容易從您的fabfile – dkarchmer

4

我通過評估Dockerfile中的python代碼行來處理此問題。

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

注意,這是從調用

User.objects.create_superuser('admin', '[email protected]', 'pass') 

django.contrib.auth.get_user_model將很好地工作custom user model如果您有任何不同的(這是很常見的),而與User.objects.create你只能創建一個標準的用戶實體,忽略任何自定義用戶模型。

此外,這是django的createsuperuser命令does under the hood相同的調用,所以它應該是相當安全的做。

0

我拿了@hoefling's answer,改了一下。

我需要創建超級用戶AFTER構建步驟。所以我把它放在一個主管腳本里面。這意味着每次運行容器時都會執行它。所以我添加了一個簡單的if/else控件來檢查是否已創建超級用戶。這減少了執行時間。我們還需要設置DJANGO_SETTINGS_MODULE環境變量。

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...'" 
相關問題