猿问

使用 docker 部署处理烧瓶中的环境变量

我正在用 docker 设置烧瓶。我有两种设置环境变量的方法,一种在烧瓶.cfg文件中,另一种在 docker.env文件中。

我想知道哪个是更好的做法。评估利弊,如果我将环境变量移动到 docker.env文件,我将不得不os.environ.get在我的应用程序代码中的所有地方做,包括处理默认值,这会在应用程序内部带来来自 os 环境变量的额外依赖。另一方面,在烧瓶配置中添加数据库密码、密钥等环境变量可能不是一个正确的主意,尽管我所有的环境变量和默认值都在一个地方。


倚天杖
浏览 204回答 3
3回答

烙印99

您不必满足于其中之一。使用环境变量来配置应用程序的各个方面(包括数据库密码)并不是一种不寻常的做法。这在Kubernetes等容器环境中或使用docker secrets已成为一种常见的做法,因为它们能够对关键信息进行加密并将其作为环境变量挂载到容器中。您可以直接在应用程序中检查环境变量的值,或者另一种选择是在 docker 中有一个入口点来检查这些值并最终创建一个您在应用程序中使用的配置文件。最后一个选项允许您使用环境变量来配置您的应用程序,或者如果您不想这样做,您可以直接将配置文件安装到您的容器中,完全跳过 envs。例如,这用于logstash docker image。

慕虎7371278

只是为了增加 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在你的应用程序中做所有事情。

蝴蝶不菲

这是我对主题的 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 environmentsDEBUG = True# DO NOT use Unsecure Secrets in production environmentsSECRET_KEY = 'This is an UNSECURE Secret. CHANGE THIS for production environments.'# SQLAlchemy settingsSQLALCHEMY_DATABASE_URI = 'postgresql:///../app.postgresql'将该文件重命名为settings.env并将内容更改为:# *****************************# Environment specific settings# *****************************# DO NOT use "DEBUG=True" in production environmentsDEBUG=True# DO NOT use Unsecure Secrets in production environmentsSECRET_KEY=This is an UNSECURE Secret. CHANGE THIS for production environments.# SQLAlchemy settingsSQLALCHEMY_DATABASE_URI=postgresql:///../app.postgresql请注意,您必须删除所有空格和引号(双打和单打)之后,您需要将该文件加载到 docker-compose.yaml 文件中:version: '3.1'services:    web:        image: web-server        env_file: path_to/settings.env然后,当您创建 Flask 应用程序时,请执行以下操作:# Instantiate Flaskapp = Flask(__name__)for variable, value in os.environ.items():    app.config[env_name] = value如果您不想在烧瓶上加载所有可用的环境变量您可以settings.env像这样为 vars 添加前缀:YOURAPP_DEBUG=True然后在应用程序创建:# Instantiate Flaskapp = Flask(__name__)for variable, value in os.environ.items():    if variable.startswith("YOURAPP_"):        env_name = variable.split("YOURAPP_")[1]        app.config[env_name] = value
随时随地看视频慕课网APP

相关分类

Python
我要回答