云 运行 Golang 容器 issue/missunderstanding

Cloud Run Golang container issue/missunderstanding

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

我们想使用容器而不只是云函数上的 go 代码,主要是为了可移植性。

本地一切正常,程序运行正常,但当我在 Cloud 运行 中尝试时,事情变得棘手。据我了解,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 table 的部分。

这是 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}"

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

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

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

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

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