我有一個運行在Gunicorn上的Django應用程序,由Ansible管理的SupervisorD管理。如何將shell環境變量傳遞給Supervisor程序?
我想讓Django從環境中讀取DJANGO_SECRET_KEY
變量,因爲我不想將我的密鑰存儲在配置文件或VCS中。對於我讀的環境中我settings.py
關鍵:
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
看着Supervisor docs它說:
注意子進程將繼承用於啓動「外殼的環境變量supervisord「除了這裏覆蓋的那些。請參閱子流程環境。
這裏是我的supervisor.conf
:
[program:gunicorn]
command=/.../.virtualenvs/homepage/bin/gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid
directory=/.../http/homepage
當我設置的變量,然後從shell中運行Gunicorn命令,它啓動就好了:
$ DJANGO_SECRET_KEY=XXX /.../.virtualenvs/homepage/bin/gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid
然而,當我設置的變量該外殼並重新啓動Supervisor服務我的應用程序無法啓動有關未找到變量的錯誤:
$ DJANGO_SECRET_KEY=XXX supervisorctl restart gunicorn
gunicorn: ERROR (not running)
gunicorn: ERROR (spawn error)
看着監事錯誤日誌:
File "/.../http/homepage/homepage/settings.py", line 21, in <module>
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
File "/.../.virtualenvs/homepage/lib/python2.7/UserDict.py", line 40, in __getitem__
raise KeyError(key)
KeyError: 'DJANGO_SECRET_KEY'
[2017-08-27 08:22:09 +0000] [19353] [INFO] Worker exiting (pid: 19353)
[2017-08-27 08:22:09 +0000] [19349] [INFO] Shutting down: Master
[2017-08-27 08:22:09 +0000] [19349] [INFO] Reason: Worker failed to boot.
我也曾嘗試重新啓動監督員服務,但同樣的錯誤出現:
$ DJANGO_SECRET_KEY=XXX systemctl restart supervisor
...
INFO exited: gunicorn (exit status 3; not expected)
我的問題是如何讓我主管爲「通」環境變量是它的子進程?
這完全是錯誤的方式。 Supervisor不在您的用戶標識下運行。您應該在supervisor配置中設置變量,而不是相反。 –
@DanielRoseman我在VCS中有我的主管配置,所以我不能把我的密鑰放在裏面。 –
閱讀'DJANGO_SECRET_KEY'環境變量與監督員conf無關。不知道你是如何做的,但你可以使用'os.environ.get('DJANGO_SECRET_KEY')'在我們的django設置文件中賦值。你也可以使用像'django-environ'這樣的軟件包。 – demonno