3 回答
TA贡献1829条经验 获得超13个赞
您不必满足于其中之一。
使用环境变量来配置应用程序的各个方面(包括数据库密码)并不是一种不寻常的做法。这在Kubernetes等容器环境中或使用docker secrets已成为一种常见的做法,因为它们能够对关键信息进行加密并将其作为环境变量挂载到容器中。
您可以直接在应用程序中检查环境变量的值,或者另一种选择是在 docker 中有一个入口点来检查这些值并最终创建一个您在应用程序中使用的配置文件。最后一个选项允许您使用环境变量来配置您的应用程序,或者如果您不想这样做,您可以直接将配置文件安装到您的容器中,完全跳过 envs。
例如,这用于logstash docker image。
TA贡献1802条经验 获得超4个赞
只是为了增加 Esteban Garcia 的出色答案,另一种好方法是同时使用两者。有一个配置文件,基于类的配置在这里很棒,因为您可以利用配置继承,并在那里拥有所有非敏感选项。对于机密、数据库密码等敏感内容 - 在配置中定义它们os.environ.get以从环境中提取这些值。所以它最终看起来像这样:
class DefaultConfig(Config):
TESTING = False
DEBUG = False
SECRET_KEY = os.getenv('APP_SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.getenv('APP_DATABASE_URI')
这样你就可以继续使用app.config,而不必os.environ.get在你的应用程序中做所有事情。
TA贡献1810条经验 获得超4个赞
这是我对主题的 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像这样为 vars 添加前缀:
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
添加回答
举报