将 Go 服务部署到 GCP Cloud Run 涉及多个步骤,包括设置 Dockerfile 和配置环境变量。
本指南将引导您完成整个过程。
如果尚未创建帐户,请先转到 GCP 创建帐户。
前往 GCP 控制台并创建一个新项目。
记下部署的项目 ID。
确保您的 Go 应用可以在本地运行并设置 Dockerfile。
cmd/main.go
// cmd/main.go func main() { flag.Parse() a := app.Application{} if err := a.LoadConfigurations(); err != nil { log.Fatalf("Failed to load configurations: %v", err) } if err := runtime.Start(&a); err != nil { log.Fatalf("Failed to start the application: %v", err) } }
运行时/base.go
func Start(a *app.Application) error { router := gin.New() router.Use(cors.New(md.CORSMiddleware())) api.SetCache(router, a.RedisClient) api.SetRoutes(router, a.FireClient, a.FireAuth, a.RedisClient) err := router.Run(":" + a.ListenPort) log.Printf("Starting server on port: %s", a.ListenPort) if err != nil { return err } return nil }
创建 Dockerfile
# Use the official Go image as the base image FROM golang:1.18 WORKDIR /app # Copy the Go module files COPY go.mod go.sum ./ RUN go mod download # Copy the rest of the application code COPY . . RUN go build -o main ./cmd/main.go CMD ["./main"]
设置环境变量
使用 shell 脚本自动设置 GCP 的环境变量
作为env-variables.sh.
// env-variables.sh #!/bin/bash # Environment variables export PROJECT_ID=recepies-6e7c0 export REGION=europe-west1 export REDIS_URL="rediss://default:AVrvA....-lemur-23279.u....:6379" export FIREBASE_ACCOUNT_KEY="/app/config/account_key.json" export CLIENT_URL="https://.....vercel.app/"
部署脚本为deploy-with-yaml.sh.
#!/bin/bash source env-variables.sh #Comment if correctly deployed docker build -t gcr.io/$PROJECT_ID/recipe-server:latest . docker push gcr.io/$PROJECT_ID/recipe-server:latest #Uncomment if json needs to be added to GCP # gcloud secrets create firebase-account-key --data-file=/mnt/c/own_dev/RecipesApp/server/config/account_key.json --project=recepies-6e7c0 #Add permission IAM gcloud projects add-iam-policy-binding recepies-6e7c0 \ --member="serviceAccount:service-988443547488@serverless-robot-prod.iam.gserviceaccount.com" \ --role="roles/artifactregistry.reader" gcloud run deploy recipe-service \ --image gcr.io/$PROJECT_ID/recipe-server:latest \ --region $REGION \ --platform managed \ --set-env-vars REDIS_URL=$REDIS_URL,CLIENT_URL=$CLIENT_URL,FIREBASE_ACCOUNT_KEY=$FIREBASE_ACCOUNT_KEY
运行部署脚本
env-variables.sh
根据需要完成所有设置后,您将看到正在构建映像并将其推送到您的 GCP 项目 Artifact Registry。最后我得到了这个。
a9099c3159f5: Layer already exists latest: digest: sha256:8c98063cd5b383df0b444c5747bb729ffd17014d42b049526b8760a4b09e5df1 size: 2846 Deploying container to Cloud Run service [recipe-service] in project [recepies-6e7c0] region [europe-west1] ✓ Deploying... Done. ✓ Creating Revision... ✓ Routing traffic... Done. Service [recipe-service] revision [recipe-service-00024-5mh] has been deployed and is serving 100 percent of traffic. Service URL: https://recipe-service-819621241045.europe-west1.run.app
有一个我多次遇到的标准错误?
Deploying container to Cloud Run service [recipe-service] in project [recepies-6e7c0] region [europe-west1] X Deploying… - Creating Revision… . Routing traffic… Deployment failed ERROR: (gcloud.run.deploy) Revision 'recipe-service-00005-b6h' is not ready and cannot serve traffic. Google Cloud Run Service Agent service-819621241045@serverless-robot-prod.iam.gserviceaccount.com must have permission to read the image, gcr.io/loyal-venture-436807-p7/recipe-server:latest. Ensure that the provided container image URL is correct and that the above account has permission to access the image. If you just enabled the Cloud Run API, the permissions might take a few minutes to propagate. Note that the image is from project [loyal-venture-436807-p7], which is not the same as this project [recepies-6e7c0]. Permission must be granted to the Google Cloud Run Service Agent service-819621241045@serverless-robot-prod.iam.gserviceaccount.com from this project. See https://cloud.google.com/run/docs/deploying#other-projects
通常它指出无法设置 PORT=8080,但主要问题是其他问题,例如未设置 env 变量,或者在我的情况下,firebase account_key.json 的部署设置不正确。
一切设置完毕后,您可以测试连接并执行请求。
我的前端部署在 Vercel 中,您可以在下面看到我的 Cloud Run 日志
通过一些关键配置和自动化脚本可以简化将 Go 服务部署到 GCP Cloud Run 的过程。
虽然可能会出现一些常见错误,例如权限问题或不正确的环境变量,但了解如何通过 Cloud Run 日志排查这些错误可确保部署顺利。
你可以在这里找到我的仓库。
以上是如何将 Go 服务部署到 GCP Cloud Run的详细内容。更多信息请关注PHP中文网其他相关文章!