将环境变量传递给GAE实例

时间:2018-04-18 16:40:24

标签: python google-app-engine environment-variables

我使用GAE来部署我的应用程序,我有一些环境变量,我想传递给我的GAE实例。例如,每次我使用数据库时,unix socket分配目前都是这样的:

unix_socket='<my_path_to_my_sockets>/{instance}'
.format(instance=properties.get_property('data.instance'))

这很好,但问题是它是一个共享代码,每当有人进行本地测试时,它就会改变路径并将更改推送到存储库。当有人拉出新的更改时,它需要更改以进行数据库请求,因为每个人都有不同的套接字更改路径。所以我创建了以下声明:

unix_socket= (os.environ['CLOUDSQL_INSTANCES_DIR'] 
if 'CLOUDSQL_INSTANCES_DIR' in os.environ 
else '/home/cpinam/cloudsql/') 
   + properties.get_property('cloud.instance')

因此,如果某人的系统中有环境变量,那么它会获取变量并避开绝对路径。问题是此环境变量不是指我的计算机而是指GAE实例

问题是,如何获取环境变量而不是服务器实例的任何环境变量?可能吗?

PS:我知道我可以通过 app.yaml 文件传递环境变量,但这意味着要修改文件。

谢谢

2 个答案:

答案 0 :(得分:2)

App Engine不支持您想要的方式。

您可能需要考虑一些替代方法。听起来您的主要约束是希望使个别开发人员能够将替代配置存储到他们可能在生产中找到的内容。您可能希望考虑允许开发人员将所述配置存储在其本地数据存储区实例中。

您的代码看起来像:

if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
  unix_socket = os.environ['CLOUDSQL_INSTANCES_DIR'] 
  ...
else:
  unix_socket = your_configuration_type.get("CLOUDSQL_INSTANCES_DIR")
  ...

另一种选择是概述here的方法,您可以将相关的环境变量存储在您自己的client_secrets.json版本中,并确保该文件列在.gitignore中。

答案 1 :(得分:0)

目前可以使用原始App Engine SDK的appcfg.py命令进行部署。据我所知,使用gcloud App Engine部署是不可能的。

您可以在app.yaml文件中定义默认环境变量:

env_variables:
  HOST_NAME: ''

使用appcfg.py命令的 -E 选项传递环境变量 -

   -E NAME:VALUE. Ex : -E HOST_NAME:WOAH

-E description:设置一个环境变量,可能会覆盖app.yaml文件中的env_variable值(可能会重复标记以设置多个变量)。