为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

您不必满足于其中之一。

使用环境变量来配置应用程序的各个方面(包括数据库密码)并不是一种不寻常的做法。这在Kubernetes等容器环境中或使用docker secrets已成为一种常见的做法,因为它们能够对关键信息进行加密并将其作为环境变量挂载到容器中。

您可以直接在应用程序中检查环境变量的值,或者另一种选择是在 docker 中有一个入口点来检查这些值并最终创建一个您在应用程序中使用的配置文件。最后一个选项允许您使用环境变量来配置您的应用程序,或者如果您不想这样做,您可以直接将配置文件安装到您的容器中,完全跳过 envs。

例如,这用于logstash docker image


查看完整回答
反对 回复 2022-01-11
?
慕虎7371278

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在你的应用程序中做所有事情。


查看完整回答
反对 回复 2022-01-11
?
蝴蝶不菲

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


查看完整回答
反对 回复 2022-01-11
  • 3 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信