【问题标题】:Handling environment variables in flask with docker deployment使用 docker 部署处理烧瓶中的环境变量
【发布时间】:2019-09-06 05:48:42
【问题描述】:

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

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

【问题讨论】:

    标签: python docker flask


    【解决方案1】:

    您不必满足于其中一个。

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

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

    这用于例如logstash docker image

    【讨论】:

      【解决方案2】:

      为了补充 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

      【讨论】:

        【解决方案3】:

        这是我对这个主题的 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
        

        【讨论】:

          猜你喜欢
          • 2016-03-09
          • 2015-12-27
          • 1970-01-01
          • 2021-05-03
          • 2021-12-12
          • 2020-05-09
          • 1970-01-01
          • 1970-01-01
          • 2019-04-24
          相关资源
          最近更新 更多