如何正确将Google Cloud Build替换项传递至Google Cloud Run环境变量?
解决Cloud Build Substitutions注入Cloud Run环境变量的问题
你的核心问题是混淆了Cloud Build步骤容器的环境变量和Cloud Run服务的环境变量:当前写法里env字段设置的变量仅作用于执行部署步骤的bash容器,并不会自动传递给Cloud Run服务。要实现需求,需通过gcloud run deploy的--set-env-vars参数显式传递。
正确实现示例
修改后的cloudbuild.yaml如下:
steps: - name: 'gcr.io/kaniko-project/executor:latest' id: 'Build & Push Image' args: - '--destination=us.gcr.io/$PROJECT_ID/$_IMAGE_NAME:$SHORT_SHA' - '--destination=us.gcr.io/$PROJECT_ID/$_IMAGE_NAME:latest' - '--dockerfile=Dockerfile' - '--context=.' - '--cache=true' - '--cache-ttl=120h' - id: 'Deploy to Cloud Run' name: 'gcr.io/cloud-builders/gcloud' args: - 'run' - 'deploy' - '$_SERVICE_NAME' - '--image=us.gcr.io/$PROJECT_ID/$_IMAGE_NAME:$SHORT_SHA' - '--region=$_REGION' - '--platform=managed' - '--allow-unauthenticated' - '--port=8983' # 用--set-env-vars传递环境变量给Cloud Run - '--set-env-vars=API_VERSION_LATEST="v1"' - '--set-env-vars=ASCOM_ALPACA_API_DEVICE_ID=$_DEVICE_ID' - '--set-env-vars=ASCOM_ALPACA_API_BASE_URL=$_BASE_URL' - '--set-env-vars=ASCOM_ALPACA_API_IP_ADDRESS=$_IP_ADDRESS' - '--set-env-vars=PLEIADES_API_KEY=$_API_KEY' - '--set-env-vars=TAILSCALE_HOST_NAME=$_TAILSCALE_HOST_NAME' - '--set-env-vars=TAILSCALE_EPHEMERAL_AUTH_KEY=$_TAILSCALE_EPHEMERAL_AUTH_KEY' substitutions: _IMAGE_NAME: your-default-image-name _SERVICE_NAME: your-default-service-name _REGION: us-central1 # 可设置自定义替换变量的默认值,触发器中可覆盖 _DEVICE_ID: default-device-id _BASE_URL: default-base-url _IP_ADDRESS: default-ip _API_KEY: default-api-key _TAILSCALE_HOST_NAME: default-host _TAILSCALE_EPHEMERAL_AUTH_KEY: default-key options: logging: CLOUD_LOGGING_ONLY
关键说明
区分两类环境变量:
- Cloud Build步骤的
env字段:仅给执行该步骤的容器(如bash)设置变量,和Cloud Run服务无关。 --set-env-vars参数:专门用于定义Cloud Run服务运行时的环境变量,是传递substitution值的正确途径。
- Cloud Build步骤的
批量简化写法:
若变量较多,可将多个环境变量合并到一个--set-env-vars参数中,用逗号分隔:- '--set-env-vars=API_VERSION_LATEST="v1",ASCOM_ALPACA_API_DEVICE_ID=$_DEVICE_ID,ASCOM_ALPACA_API_BASE_URL=$_BASE_URL'Substitution复用技巧:
在substitutions块中设置自定义变量的默认值,后续创建Cloud Build触发器时,可针对不同服务覆盖这些值,实现触发器的跨服务复用。变量规则:
- 自定义替换变量必须以
_开头(如_IMAGE_NAME),内置变量(如$PROJECT_ID、$SHORT_SHA)直接引用即可。 - 变量名大小写敏感,需确保触发器配置与yaml中的变量名完全一致。
- 自定义替换变量必须以
内容的提问来源于stack exchange,提问作者Micheal J. Roberts
相关产品推荐
相关产品推荐

