当前位置: 首页 > 面试题库 >

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

百里文景
2023-03-14
问题内容

我已经在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 App
Engine上部署时却无法工作。


问题答案:

它在官方文档中没有记录:定义环境变量,但是在调用函数app.yaml之前不会设置生产环境中定义的环境变量init()。仅在处理第一个请求之前设置它们。

在此报告了此问题。引用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
}


 类似资料:
  • 我需要将API密钥和其他敏感信息存储在中,作为在GAE上部署的环境变量。这样做的问题是,如果我将推送到GitHub,这些信息将变得公开(不好)。我不想将信息存储在数据存储中,因为它不适合项目。相反,我想在应用程序的每个部署上从中列出的文件中交换值。 这是我的应用程序。yaml文件: 有什么想法吗?

  • 问题内容: 在OS X中修改环境变量(如PATH)的正确方法是什么? 我稍微看了一下Google,发现需要编辑三个不同的文件: /etc/paths 〜/ .profile 〜/ .tcshrc 我什至没有这些文件,而且我很确定.tcshrc是错误的,因为OS X现在使用bash。这些变量(尤其是PATH)在哪里定义? 我正在运行OS X v10.5(Leopard)。 问题答案: 布鲁诺是正确的

  • 我最近从Windows 8.1升级到了Windows 10。 现在我想为新安装的ApacheMaven设置一个环境变量。 每次我创建用户变量时,一切都很好。然而,我还需要创建系统变量,在这里我需要将bin目录附加到我已经在用户变量中创建的变量“path”。 现在,每次我这样做,我都会得到一个错误,说“这个环境变量太大了”。因此,我无法创建路径。 我已经附上了这个错误的图像。

  • 我在Windows10机器上运行Docker1.12.0。我正在开发一个Java程序,使用Maven 3.3.9作为依赖项管理器。我有一个maven docker插件(https://github.com/fabric8io/docker-maven-plugin),它在干净安装时会出现以下错误。 [ERROR]未能执行目标IO.fabric8:docker-maven-plugin:0.15.1

  • 一个朋友让我为他们做一个minecraft插件,所以我需要安装Maven。我已经按照教程的指示安装了以下用户变量。 > java_home--值:C:\program files\java\jdk1.8.0\bin windows 7 maven 2安装 当我尝试在命令Propmpt中设置它时,它会响应我,说。如何成功运行? 谢谢你的阅读。 另外,这是我的系统路径变量值:有什么问题吗?

  • 问题内容: 我在下面的代码中只想设置一个环境变量: 运行此文件: 该调用可以正确打印,但是随后我希望在会话中也设置此env变量,但是: 什么都没有,它是空的。这是预期的行为吗?如果是这样,我如何使这个env变量在我的会话中保持不变,并使用类似这样的程序对其进行设置? 问题答案: 创建新流程时,将复制父流程的环境。在新流程中对环境所做的更改不会影响父流程。修改环境后,您必须让程序启动Shell。