在app.yaml上指定的环境变量,但它不在main.go上获取

时间:2015-10-26 00:49:23

标签: google-app-engine go yaml

我已经在app.yaml中指定了我的环境变量,并且当我在本地计算机上运行它时它被取出但是一旦我部署了它 - 它没有取出它。

以下是我如何设置它:

application: some-application
version: 1
runtime: go
api_version: go1
threadsafe: true

handlers: 
- url: /.*
  script: main.go
  secure: always

env_variables: 
  ENVIRONMENT_VAR1: 'some key'
  ENVIRONMENT_VAR2: 'some key'
  ENVIRONMENT_VAR3: 'some key'

我正在使用os.Getenv("ENVIRONMENT_VAR1")检索密钥,当我在本地运行它时它可以正常工作但在部署在Google应用引擎上时无法正常工作。

2 个答案:

答案 0 :(得分:3)

在官方文档Defining environment variables中没有记录,但生成中app.yaml中定义的环境变量在调用init()函数之前未设置。它们仅在提供第一个请求之前设置。

此问题已报告here。引用AppEngine工程师的回答:

  

右。由于实现的性质,不幸的是,init函数中没有环境变量。   虽然它们与请求无关,但在所有init函数都已运行之后才会设置它们,但是在处理第一个请求之前设置它们。

     

因此,您可以在主处理程序中使用sync.DoOnce,根据环境变量的值执行所需的任何操作,因为它将在那时正确设置。

使用Once.Do()实现此目的的示例:

var once = sync.Once{}

func MainHandler(w http.ResponseWriter, r *http.Request) {
    once.Do(mysetup)
    // do your regular stuff here
}

func mysetup() {
    // This function is executed only once. Read / use env vars here.
    var1 := os.Getenv("ENVIRONMENT_VAR1")
    _ = var1 // use var1
}

答案 1 :(得分:0)

提供的答案icza对我有用。另外,我在/ _ah / start方法的处理程序中放入了once.Do()调用,以便在GAE启动我的应用程序时立即调用它。