Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用docker部署在flask中处理环境变量_Python_Docker_Flask - Fatal编程技术网

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

Python 使用docker部署在flask中处理环境变量,python,docker,flask,Python,Docker,Flask,我在和docker准备烧瓶。我有两种设置环境变量的方法,一种在flask.cfg文件中,另一种在docker.env文件中 我想知道哪一个是更好的练习。在评估利弊时,如果我将环境变量移动到docker.env文件中,我将不得不在应用程序代码中的所有位置执行os.environ.get,包括处理默认值,这会在应用程序内部带来来自os环境变量的额外依赖性。另一方面,在flask config中添加环境变量(如DB password、secret Key等)可能不是一个正确的想法,尽管我所有的环境变量

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


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

您不必满足于其中一个

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

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


例如,在.

上使用这一点只是为了补充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')
YOURAPP_DEBUG=True

这样,你就可以继续使用app.config,而不必在你的应用程序上运行os.environ.get。

这是我给这个主题的2美分

问题

我正在将一个flask应用程序移植到docker,并希望将我的settings.py config vars移动到env vars,以便容器的env能够获取它们。这样,只需设置env vars,就可以更轻松地将其部署到ECS等外部服务上,并且应用程序仍将保持不变

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

此外,我将使用docker compose来执行所有容器

从.py迁移到.env

第一件事是将python代码转换为与docker compose兼容的语法。因此,如果在settings.py中有此选项:

将该文件重命名为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
请注意,您必须删除所有空格和引号double和single

之后,您需要将该文件加载到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上的变量添加前缀,如下所示:

class DefaultConfig(Config):
    TESTING = False
    DEBUG = False
    SECRET_KEY = os.getenv('APP_SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.getenv('APP_DATABASE_URI')
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