Python 使用docker部署在flask中处理环境变量
我在和docker准备烧瓶。我有两种设置环境变量的方法,一种在flask.cfg文件中,另一种在docker.env文件中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.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