要让gunicorn
下的supervisord
使用虚拟环境/home/ubuntu/venv/bin
,就不必寻找明智的放置source /home/ubuntu/venv/bin/activate
的地方。这样写就足够了:
[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/hello/
environment=PATH="/home/ubuntu/venv/bin:%(ENV_PATH)"
在/usr/supervisor/hello.conf
中。
下一个任务是引入整个环境变量。一种方法是如下苦苦地扩充supervisord
配置文件。
[program:hello]
...
environment=PATH="/home/ubuntu/venv/bin:%(ENV_PATH)",SECRET_KEY="%(ENV_SECRET_KEY)",DATABASE_URI="%(ENV_DATABASE_URI)",etc1,etc2,etc3
是否有办法一次性引入环境变量(例如在~/.profile
中初始化它们之后?
答案 0 :(得分:0)
这是食谱:
将环境变量写入文件/home/ubuntu/prog/.env
。
export FLASK_APP=/home/ubuntu/prog/hello.py
export SECRET_KEY=ABCD
export DATABASE_PASSWORD=EFGH
使用dotenv
的{{1}}加载环境变量。
load_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"
的{{1}}。
在前台启动supervisord
以确认一切正常。
environment=
从另一个shell确认一切正常。
supervisord
杀死/usr/bin/supervisord -n -edebug -c /etc/supervisor/hello.conf
。由于它位于前台,因此只需CTRL-c就可以了。
将$ curl localhost:8000
ABCDEFGH
作为守护程序启动。
supervisord
关注三个日志文件supervisord
,/usr/bin/supervisord -c /etc/supervisor/hello.conf
和prog/hello_out.log
。
也许最重要的一点是避免使用prog/hello_err.log
的{{1}}。 SO chatter建议它处理逗号,引号,制表符甚至换行符。从经验上讲,这并不成立(至少对于prog/hello_supervisord.log
3.3.5而言),文档也没有以一种或另一种方式解决它。两行942-943
如果有人愿意调查文档的不足之处,似乎是parsing发生的地方。
答案 1 :(得分:0)
要永久,安全地一次导入环境变量,必须在$ HOME目录的 .bashrc 中添加以下行。 为此,使用您喜欢的代码编辑器在主目录中打开 .bashrc 文件:
[my_data]
a_variable = 1
b_variable = hello
c_variable = world
d_variable = 5.4231
在 .bashrc 文件中的某处添加以下行:
nano .bashrc
现在要在烧瓶中使用此SECRET_KEY,您必须导入os模块并像这样使用它。
export SECRET_KEY="YOUR SECRET KEY."
希望这会有所帮助。