无法在 GCP 中指定 gflag

问题描述

我有一个 Go 服务器程序,它需要在运行时传递一个特定的 gflag 值,但我无法在 GCP 的 app.yaml 文件中指定它。我对 GCP 很陌生,所以这可能是一个未启动的查询

这是我的 Go 代码结构:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -fno-common -c as41.c

main.go 是典型的 Golang HTTP 服务器程序,大致具有以下结构:

project_root
   |
   |___cmd
        |___ main
                |___ main.go
                |___ foo_handlers.go (defines FooHandler(w,r))
                |___ bar_handlers.go (defines BarHandler(w,r))

我的 GCP app.yaml 文件大致如下:

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(..)

这工作正常,但您会注意到,我无法将任何自定义值传递给 runtime: go114 main: ./cmd/main handlers: - url: /.* script: auto 标志。目前,我只是将认标志值硬编码为在 GCP 中部署的首选值,我不检查该更改,这显然是实现目标的一种非常粗略的方式。

我尝试将 some_flag 配置设置为: entrypoint 要么 entrypoint: ./cmd/main/main --some_flag=gcp

但对于这两种情况,GCP 都会以 entrypoint: .bin/main --some_flag=gcp 形式的错误输出

通过像这样指定一个 web dyno,我可以在 Heroku 中很容易地实现同样的目标: /bin/sh: 1: exec: bin/main: not found

如何在 GCP 应用中设置相同的值?我正在使用 GCP 标准环境。而且我不想为此使用环境变量。

谢谢!

解决方法

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

  1. 保持 App Engine 标准并使用环境变量而不是标志
  2. 使用App Engine Flexible,with a custom runtime。像这样,你必须提供一个 Dockerfile,因此你可以指定你想要的入口点。但是,App Engine 灵活不会扩展到 0,因此对于小型和低流量应用来说非常昂贵
  3. 作为 App Engine Flexible,定义一个 Dockerfile,但这次将其部署在 Cloud Run 上。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...