0

我有一个 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=gcpentrypoint: .bin/main --some_flag=gcp

但是对于这两种情况,GCP 都会出错,并显示/bin/sh: 1: exec: bin/main: not found.

通过指定这样的网络测功机,我可以在 Heroku 中轻松实现相同的目标: bin/main --some_flag=heroku

如何在 GCP 应用程序中进行设置?我正在使用 GCP 标准环境。而且我不想使用相同的环境变量。

谢谢!

4

1 回答 1

0

您无法使用 App Engine 将标志传递给您的主函数。您有 3 个解决方案:

  1. 保持 App Engine 标准并使用环境变量而不是标志
  2. 使用具有自定义运行时的 App Engine Flexible。像这样,您必须提供 Dockerfile,因此您可以指定所需的入口点。但是,App Engine flexible 不会扩展到 0,因此对于小型且低流量的应用程序来说非常昂贵
  3. 作为 App Engine Flexible,定义一个 Dockerfile,但这次将其部署在Cloud Run上。

就个人而言,我建议使用环境变量,因为如果要更改值,则不必重建容器,只需更改值并部署新修订版(相同的容器,但上下文不同)

于 2021-07-01T19:09:52.360 回答