Cloud Run Golang 容器问题/误解

Posted

技术标签:

【中文标题】Cloud Run Golang 容器问题/误解【英文标题】:Cloud Run Golang container issue/missunderstanding 【发布时间】:2021-12-28 14:53:06 【问题描述】:

我正在尝试对我们组织的 Cloud Storage 中的所有项目中的所有对象进行报告。我正在使用来自 Google Professionnal Services 的这个 repo,因为它完全符合我们的要求:https://github.com/GoogleCloudPlatform/professional-services/tree/main/tools/gcs2bq

我们想使用容器而不是 Cloud Function 上的 go 代码,主要是为了实现可移植性。

本地一切都很好,程序按预期运行,但是当我在 Cloud Run 中尝试时,事情变得棘手。据我了解,go部分需要监听一个端口,我在main开头添加了这个端口,这样就可以部署容器了,就是这样:

// Determine port for HTTP service
port := os.Getenv("PORT")
if port == "" 
        port = "8080"
        log.Printf("defaulting to port %s", port)


Start HTTP server.
log.Printf("listening on port %s", port)
if err := http.ListenAndServe(":"+port, nil); err != nil 
        log.Fatal(err)

但正如您在 repo 中看到的,第一个调用的文件是 run.sh 文件。其中设置环境变量然后调用main.go。它成功完成了它的任务,即获取不同文件的所有大小。但在那之后,run.sh 不会“恢复”并转到它在本地工作的 BigQuery 表中上传数据的部分。

这是run.sh 文件中我遇到问题的部分。注意:执行./gcs2bq 没有错误注意2:每个环境变量都有正确的值

./gcs2bq $GCS2BQ_FLAGS || error "Export failed!" 2    <- doesnt get past this line


gsutil mb -p "$GCS2BQ_PROJECT" -c standard -l "$GCS2BQ_LOCATION" -b on "gs://$GCS2BQ_BUCKET" || echo "Info: Storage bucket already exists: $GCS2BQ_BUCKET"

gsutil cp "$GCS2BQ_FILE" "gs://$GCS2BQ_BUCKET/$GCS2BQ_FILENAME" || error "Failed copying $GCS2BQ_FILE to gs://$GCS2BQ_BUCKET/$GCS2BQ_FILENAME!" 3

bq mk --project_id="$GCS2BQ_PROJECT" --location="$GCS2BQ_LOCATION" "$GCS2BQ_DATASET" || echo "Info: BigQuery dataset already exists: $GCS2BQ_DATASET"

bq load --project_id="$GCS2BQ_PROJECT" --location="$GCS2BQ_LOCATION" --schema bigquery.schema --source_format=AVRO --use_avro_logical_types --replace=true "$GCS2BQ_DATASET.$GCS2BQ_TABLE" "gs://$GCS2BQ_BUCKET/$GCS2BQ_FIL$
  error "Failed to load gs://$GCS2BQ_BUCKET/$GCS2BQ_FILENAME to BigQuery table $GCS2BQ_DATASET.$GCS2BQ_TABLE!" 4

gsutil rm "gs://$GCS2BQ_BUCKET/$GCS2BQ_FILENAME" || error "Failed deleting gs://$GCS2BQ_BUCKET/$GCS2BQ_FILENAME!" 5

rm -f "$GCS2BQ_FILE"

我对容器和 Cloud Run 有点陌生,即使在阅读了项目和文档之后,我也不确定自己做错了什么,在调用 main.go 时 .sh “卡住”是否正常?如果需要,我可以提供更多细节/解释。

【问题讨论】:

【参考方案1】:

好的,所以对于遇到类似情况的任何人来说,这就是我让它为我工作的方式。

容器不应该停止,所以没有退出,它会回到主函数。

这意味着当我调用可执行文件时,它只是循环,从未退出并完成任务。所以这里的解决方案是将golang中调用后的所有内容直接“重新编码”到main.go中

这里的 run.sh 没有用,所以我使用了另一个 .go 文件来侦听 http 请求,然后调用收集数据并将其发送到 Bigquery 的代码。

【讨论】:

以上是关于Cloud Run Golang 容器问题/误解的主要内容,如果未能解决你的问题,请参考以下文章

输入使用 Google Cloud Run 运行的 docker 容器

Cloud Run 错误:容器无法启动

Cloud Run Flask API 容器运行 shutit 进入休眠循环

您可以在 Cloud Run 容器中运行沙盒容器吗?

如何检查正在运行的 Google Cloud Run 容器的实例数?

Google Pub/Sub + Cloud Run 生成多个容器