Вот рецепт:
Запишите переменные среды в файл /home/ubuntu/prog/.env
.
export FLASK_APP=/home/ubuntu/prog/hello.py
export SECRET_KEY=ABCD
export DATABASE_PASSWORD=EFGH
Используйте load_dotenv
dotenv
для загрузки переменных среды.
from flask import Flask
from os.path import join, dirname
from os import environ
from dotenv import load_dotenv
app = Flask(__name__)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
@app.route('/')
def hello():
SECRET_KEY = environ.get("SECRET_KEY")
DATABASE_PASSWORD = environ.get("DATABASE_PASSWORD")
return SECRET_KEY + DATABASE_PASSWORD
Напишите файл /etc/supervisor/hello.conf
.
[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/prog
stdout_logfile=/home/ubuntu/prog/hello_out.log
stderr_logfile=/home/ubuntu/prog/hello_err.log
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
[supervisord]
logfile=/home/ubuntu/prog/hello_supervisord.log
pidfile=/tmp/supervisord.pid
Загрузите среду и укажите на приложение.
source /home/ubuntu/prog/.env
Переменные среды загружены,
$ export | grep SECRET
declare -x SECRET_KEY="ABCD"
и они будут переданы подпроцессу, не вмешиваясь в supervisord
environment=
.
Запустите supervisord
на переднем плане, чтобы убедиться, что все в порядке.
/usr/bin/supervisord -n -edebug -c /etc/supervisor/hello.conf
Подтвердите из другой оболочки, что все в порядке.
$ curl localhost:8000
ABCDEFGH
Убить supervisord
. Поскольку он находится на переднем плане, достаточно его CTRL-c.
Запустить supervisord
как демон.
/usr/bin/supervisord -c /etc/supervisor/hello.conf
Следите за тремя файлами журнала prog/hello_out.log
, prog/hello_err.log
и prog/hello_supervisord.log
.
Возможно, самый важный момент - избегать использования supervisord
environment=
. SO-болтовня предполагает, что он обрабатывает запятые, кавычки, табуляции и даже символы новой строки. Эмпирически это не выполняется (по крайней мере, для supervisord
3.3.5), и документация не решает этого так или иначе. Две строчки 942-943 кажутся там, где если кто-то захочет исследовать недостаточность документации.
person
Calaf
schedule
31.03.2019
supervisord
Наследует ли вашу среду при запуске или создает свою собственную? Ввод Venv просто устанавливает некоторые переменные среды, поэтому вам нужно убедиться, что они правильно установлены в средеsupervisord
. - person chepner   schedule 31.03.2019environment
supervisord
- это IIUC для переменных среды, а не для виртуальной среды Python. - person Calaf   schedule 31.03.2019PATH
в вашей среде. ЕслиPATH
supervisord
не включает/home/ubuntu/venv/bin
, то он не будет использовать правильный интерпретатор Python. - person chepner   schedule 31.03.2019source ..activate
настройкой средыsupervisord
внутри блока[program:hello]
, не так ли? Это не помогает. - person Calaf   schedule 31.03.2019os.environ['PATH']
из представления, чтобы его можно было осмотреть? - person SuperShoot   schedule 31.03.2019sys.version
, я вижу, что я действительно нахожусь в виртуальной среде в этом игрушечном / приветственном приложении, но не в моем реальном приложении. Так что моя изоляция для этого вопроса не является полной. - person Calaf   schedule 31.03.2019