我正在嘗試對我們組織的 Cloud Storage 中所有專案中的所有物件進行報告。我正在使用來自 Google 專業服務的這個 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 時“卡住”是否正常?任何幫助表示贊賞,如果需要,我可以提供更多細節/解釋。
提前致謝。
uj5u.com熱心網友回復:
好的,對于遇到類似情況的任何人,這就是我讓它為我作業的方式。
容器不應該停止所以沒有退出,它會回到主函式。
這意味著當我呼叫可執行檔案時,它只是回圈,從未退出并完成任務。所以這里的解決方案是將 golang 中呼叫之后的所有內容“重新編碼”到 main.go 中
這里 run.sh 是無用的,所以我使用了另一個 .go 檔案來偵聽 http 請求,然后呼叫收集資料并將其發送到 Bigquery 的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400792.html
