这是我对这个主题的 2 美分。
问题
我正在将一个烧瓶应用程序移植到 docker,并希望将我的 settings.py 配置变量移动到环境变量,以便它们将被容器的 env 拾取。这样,只需设置 env vars 就可以更轻松地将其部署到 ECS 等外部服务上,并且应用程序仍然保持不变。
因为我在 settings.py 上有很多配置变量,并且不想在创建烧瓶应用程序时手动设置它们,所以我想出了以下解决方案。
另外,我将使用 docker-compose 来执行所有容器。
从 .py 迁移到 .env
首先是从 python 代码转移到与 docker-compose 兼容的语法。所以,如果你在settings.py 有这个:
# *****************************
# Environment specific settings
# *****************************
# DO NOT use "DEBUG = True" in production environments
DEBUG = True
# DO NOT use Unsecure Secrets in production environments
SECRET_KEY = 'This is an UNSECURE Secret. CHANGE THIS for production environments.'
# SQLAlchemy settings
SQLALCHEMY_DATABASE_URI = 'postgresql:///../app.postgresql'
将该文件重命名为 settings.env 并将内容更改为:
# *****************************
# Environment specific settings
# *****************************
# DO NOT use "DEBUG=True" in production environments
DEBUG=True
# DO NOT use Unsecure Secrets in production environments
SECRET_KEY=This is an UNSECURE Secret. CHANGE THIS for production environments.
# SQLAlchemy settings
SQLALCHEMY_DATABASE_URI=postgresql:///../app.postgresql
请注意,您必须删除所有空格和引号(双引号和单引号)
之后,您需要将该文件加载到 docker-compose.yaml 文件中:
version: '3.1'
services:
web:
image: web-server
env_file: path_to/settings.env
然后,当您创建 Flask 应用程序时,请执行以下操作:
# Instantiate Flask
app = Flask(__name__)
for variable, value in os.environ.items():
app.config[env_name] = value
如果您不想在烧瓶上加载所有可用的环境变量
您可以像这样为 settings.env 上的变量添加前缀:
YOURAPP_DEBUG=True
然后在创建应用程序时:
# Instantiate Flask
app = Flask(__name__)
for variable, value in os.environ.items():
if variable.startswith("YOURAPP_"):
env_name = variable.split("YOURAPP_")[1]
app.config[env_name] = value