Cloud Run Golang 容器问题/误解

我正在尝试对我们组织的云存储中所有项目中的所有对象进行报告。我正在使用来自 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文件中我有问题的部分。注意:执行注释 2 时没有错误./gcs2bq:每个环境变量都有正确的值


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


蛊毒传说
浏览 98回答 1
1回答

交互式爱情

好的,所以对于遇到类似情况的任何人来说,这就是我让它为我工作的方式。容器不应该停止,所以没有退出,它只会回到主函数。这意味着当我调用可执行文件时它只是循环并且从未退出并完成任务。所以这里的解决方案是将 golang 调用之后的所有内容直接“重新编码”到 main.go在这里,run.sh 是无用的,所以我使用了另一个 .go 文件来侦听 http 请求,然后调用收集数据并将其发送到 Bigquery 的代码。
打开App,查看更多内容
随时随地看视频慕课网APP