无法在 GCP 中指定 gflag
Unable to specify gflag in GCP
我有一个 Go 服务器程序需要在运行时传递一个特定的 gflag 值,但我无法在 GCP 的 app.yaml 文件中指定它。我是 GCP 的新手,所以这可能是一个未启动的查询。
这是我的 Go 代码结构:
project_root
|
|___cmd
|___ main
|___ main.go
|___ foo_handlers.go (defines FooHandler(w, r))
|___ bar_handlers.go (defines BarHandler(w, r))
main.go 是典型的 Golang HTTP 服务器程序,大致具有以下结构:
func main() {
// Flags
flag.StringVar(
&SomeFlagVar,
"some_flag", // flag name
"dev_value", // default value
"Some Flag")
flag.Parse()
// Foo
http.HandleFunc("/foo", FooHandler)
// Bar
http.HandleFunc("/bar/", BarHandler)
// Server starting boiler plate code
http.ListenAndServe(..)
我的 GCP app.yaml 文件大致如下所示:
runtime: go114
main: ./cmd/main
handlers:
- url: /.*
script: auto
这工作正常,但正如您所注意到的,我无法将任何自定义值传递给 some_flag
标志。现在,我只是将默认标志值硬编码为在 GCP 中部署的首选值,我不检查该更改,这显然是实现目标的一种非常粗略的方式。
我尝试将 entrypoint
配置设置为:
entrypoint: ./cmd/main/main --some_flag=gcp
或者
entrypoint: .bin/main --some_flag=gcp
但是对于这两种情况,GCP 都会出现 /bin/sh: 1: exec: bin/main: not found
.
形式的错误
我可以在 Heroku 中通过指定一个 web dyno 很容易地实现同样的效果,如下所示:
bin/main --some_flag=heroku
如何在 GCP 应用程序中进行相同的设置?我正在使用 GCP 标准环境。而且我不想为此使用环境变量。
谢谢!
您无法使用 App Engine 将标志传递给您的主函数。您有 3 个解决方案:
- 坚持 App Engine 标准并使用环境变量而不是标志
- 使用App Engine Flexible, with a custom runtime。像那样,您必须提供一个 Dockerfile,因此您可以指定您想要的入口点。但是,App Engine flexible 不会扩展到 0,因此对于小型和低流量应用程序来说非常昂贵
- 作为 App Engine Flexible,定义一个 Dockerfile,但这次将其部署在 Cloud Run。
就我个人而言,我建议使用环境变量,因为如果要更改值,则不必重建容器,只需更改值并部署新的修订版(同一容器,但不同上下文)
我有一个 Go 服务器程序需要在运行时传递一个特定的 gflag 值,但我无法在 GCP 的 app.yaml 文件中指定它。我是 GCP 的新手,所以这可能是一个未启动的查询。
这是我的 Go 代码结构:
project_root
|
|___cmd
|___ main
|___ main.go
|___ foo_handlers.go (defines FooHandler(w, r))
|___ bar_handlers.go (defines BarHandler(w, r))
main.go 是典型的 Golang HTTP 服务器程序,大致具有以下结构:
func main() {
// Flags
flag.StringVar(
&SomeFlagVar,
"some_flag", // flag name
"dev_value", // default value
"Some Flag")
flag.Parse()
// Foo
http.HandleFunc("/foo", FooHandler)
// Bar
http.HandleFunc("/bar/", BarHandler)
// Server starting boiler plate code
http.ListenAndServe(..)
我的 GCP app.yaml 文件大致如下所示:
runtime: go114
main: ./cmd/main
handlers:
- url: /.*
script: auto
这工作正常,但正如您所注意到的,我无法将任何自定义值传递给 some_flag
标志。现在,我只是将默认标志值硬编码为在 GCP 中部署的首选值,我不检查该更改,这显然是实现目标的一种非常粗略的方式。
我尝试将 entrypoint
配置设置为:
entrypoint: ./cmd/main/main --some_flag=gcp
或者
entrypoint: .bin/main --some_flag=gcp
但是对于这两种情况,GCP 都会出现 /bin/sh: 1: exec: bin/main: not found
.
我可以在 Heroku 中通过指定一个 web dyno 很容易地实现同样的效果,如下所示:
bin/main --some_flag=heroku
如何在 GCP 应用程序中进行相同的设置?我正在使用 GCP 标准环境。而且我不想为此使用环境变量。
谢谢!
您无法使用 App Engine 将标志传递给您的主函数。您有 3 个解决方案:
- 坚持 App Engine 标准并使用环境变量而不是标志
- 使用App Engine Flexible, with a custom runtime。像那样,您必须提供一个 Dockerfile,因此您可以指定您想要的入口点。但是,App Engine flexible 不会扩展到 0,因此对于小型和低流量应用程序来说非常昂贵
- 作为 App Engine Flexible,定义一个 Dockerfile,但这次将其部署在 Cloud Run。
就我个人而言,我建议使用环境变量,因为如果要更改值,则不必重建容器,只需更改值并部署新的修订版(同一容器,但不同上下文)