Terraform配置Cloud Build Trigger部署Cloud Run镜像失败排查
问题描述
使用Terraform配置google_cloudbuild_trigger与google_cloud_run_v2_service资源后,GUI中触发器配置显示正常,但镜像构建始终失败,具体问题如下:
- Terraform应用错误
执行terraform apply时收到报错:
Error: Error waiting to create Service: Error waiting for Creating Service: Error code 13, message: Revision 'cloud_run-00001-xxx' is not ready and cannot serve traffic. Image 'gcr.io/<project>/my-cb-gh-repo' not found.
- 手动配置后的构建错误
在Cloud Run服务GUI中编辑持续部署触发器,指向GitHub仓库与Dockerfile后,触发仍失败,构建日志显示invoke.go存在语法错误:
can't load package: package .:
invoke.go:4:1: expected 'package', found ""
invoke.go:4:3: string literal not terminated
- 触发器配置矛盾点
- 在触发器的
build块中添加name = "gcr.io/cloud-builders/docker" args = ["push", "gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA"]步骤时,触发器会转而寻找Cloud Build配置文件而非Dockerfile; - 移除push步骤后,触发器会正确寻找Dockerfile,但构建仍失败。
相关配置代码
Cloud Run Service配置
resource "google_cloud_run_v2_service" "cloud_run_service" { provider = google-beta name = var.cloud_run_service_name location = var.region template { service_account = data.terraform_remote_state.config1.outputs.cloud_run_sa containers { image = "gcr.io/${data.google_project.project.project_id}/${google_cloudbuildv2_repository.gh_repo.name}" } } }
Cloud Build触发器配置
resource "google_cloudbuild_trigger" "cloud_bld_trigger7" { name = "cloud-bld-trigger7" description = "Trigger with repository_event_config and build" provider = google-beta location = var.region repository_event_config { repository = google_cloudbuildv2_repository.gh_repo.id push { branch = "^main$" } } build { images = ["gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA"] options { logging = "CLOUD_LOGGING_ONLY" } step { name = "gcr.io/cloud-builders/docker" args = ["build", "-t", "gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA", "-f", "Dockerfile", "."] } substitutions = { _BRANCH_NAME = "^main$" } } }
Dockerfile与Go代码
Dockerfile
FROM golang:1.13 as builder WORKDIR /app COPY invoke.go ./ RUN CGO_ENABLED=0 GOOS=linux go build -v -o server.go FROM ghcr.io/dbt-labs/dbt-bigquery:1.5.0 USER root WORKDIR /dbt COPY --from=builder /app/server ./ COPY script.sh ./ COPY . ./ ENTRYPOINT "./server"
invoke.go
package main import ( "fmt" "log" "net/http" "os" "os/exec" ) func handler(w http.ResponseWriter, r *http.Request) { log.Print("Request Received") cmd := exec.Command("/bin/sh", "script.sh") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { log.Fatalf("cmd.Run() failed with %s\n", err) } } func main() { log.Print("Server starting") http.HandleFunc("/", handler) port := os.Getenv("PORT") if port == "" { port = "8080" } log.Printf("%s port listening", port) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil)) }
错误日志详情
Cloud Build构建日志错误
BUILD Starting Step #0 - "Build" Step #0 - "Build": Already have image (with digest): gcr.io/cloud-builders/docker Step #0 - "Build": Sending build context to Docker daemon 548.4kB Step #0 - "Build": Step 1/11 : FROM golang:1.13 as builder Step #0 - "Build": 1.13: Pulling from library/golang Step #0 - "Build": xxxxx: Pulling fs layer // Waiting // Verify Checksum // Download complete // Pull complete //// Step #0 - "Build": Digest: sha256:yyyyyyyyyy Step #0 - "Build": Status: Downloaded newer image for golang:1.13 Step #0 - "Build": ---> aaaaaa Step #0 - "Build": Step 2/11 : WORKDIR /app Step #0 - "Build": ---> Running in bbbb Step #0 - "Build": Removing intermediate container bbbb Step #0 - "Build": ---> cccccc Step #0 - "Build": Step 3/11 : COPY invoke.go ./ Step #0 - "Build": ---> ddddd Step #0 - "Build": Step 4/11 : RUN CGO_ENABLED=0 GOOS=linux go build -v -o server.go Step #0 - "Build": ---> Running in eeeee Step #0 - "Build": can't load package: package .: Step #0 - "Build": invoke.go:4:1: expected 'package', found "" Step #0 - "Build": invoke.go:4:3: string literal not terminated Step #0 - "Build": The command '/bin/sh -c CGO_ENABLED=0 GOOS=linux go build -v -o server.go' returned a non-zero code: 1 Finished Step #0 - "Build" ERROR ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1
Cloud Run GUI手动配置错误
Creating revision Image 'gcr.io/<_project_>/my-cb-gh-repo' not found. Routing traffic Pending Creating Cloud Build trigger Completed Building and deploying from repository (see logs) Trigger execution failed: source code could not be built or deployed, find more information in build logs Revision 'cloud_run-00001-xxx' is not ready and cannot serve traffic. Image 'gcr.io/<_project_>/my-cb-gh-repo' not found.
触发器配置测试结果
| 触发器配置块组合 | 结果 |
|---|---|
| github + build块 | 显示正常,但为1st Gen源 |
| repository_event_config块 + filename | 2nd Gen,但会在仓库中寻找Cloud Build配置文件(错误指向Dockerfile) |
| trigger_template + git_file_source块 | GUI报错 |
| github块 + filename | 1st Gen,在仓库中寻找Cloud Build配置文件 |
| repository_event_config + build块(含push步骤) | 2nd Gen,在仓库中寻找Cloud Build配置文件 |
| repository_event_config + build块(不含push步骤) | 2nd Gen,会寻找Dockerfile(符合预期),但构建失败 |
内容的提问来源于stack exchange,提问作者mailer-daemon
相关产品推荐
相关产品推荐

