使用docker部署在Flask中处理环境变量

时间:2019-04-16 07:31:11

标签: python docker flask

我正在与docker一起安装Flask。我有两种方法来设置环境变量,一种是在flask .cfg文件中,另一种是在docker .env文件中。

我想知道哪种方法更好。评估优缺点,如果我将环境变量移至docker .env文件,则必须在应用程序代码的所有位置执行os.environ.get,包括处理默认值,这会在应用程序内部带来额外的依赖性来自os环境变量。另一方面,尽管我所有的环境变量和默认值都放在一个位置,但是在flask config中添加环境变量(如DB密码,秘密密钥等)可能不是一个正确的主意。

3 个答案:

答案 0 :(得分:2)

您不必满足于另一方。

使用环境变量来配置应用程序的各个方面(包括DB密码)并不是不寻常的做法。这注视着在诸如Kubernetes或使用docker secrets之类的容器环境中经常出现,因为它们可以使关键信息保持加密并将其作为环境变量安装到您的容器中。

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

例如在logstash docker image上使用。

答案 1 :(得分:1)

只需增加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 :(得分:0)

这是我给这个问题的2美分。

问题

我当时正在将Flask应用程序移植到docker,并想将settings.py配置变量移动到env变量,以便它们被容器的env接收。这样,仅通过设置env vars就可以更轻松地将其部署到ECS之类的外部服务上,并且该应用程序仍然相同。

因为我在settings.py上有很多配置变量,并且不想在创建flask应用程序时手动设置它们,所以我提出了以下解决方案。

此外,我将使用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

如果您不想在烧瓶上加载所有可用的env变量

您可以像这样在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