我已经在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应用引擎上时无法正常工作。
答案 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启动我的应用程序时立即调用它。