You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform CloudBuild模板的docker run参数中引用secret_env值?

问题解决:CloudBuild args中引用secret_env值的正确方式

可以在CloudBuild的args中引用secret_env值,你的问题出在变量转义和引号使用上,具体修正如下:

问题分析

你当前的写法中,--env DATABASE_CREDENTIALS='$$DATABASE_CREDENTIALS'使用了单引号,这会导致shell不会解析其中的变量,容器最终拿到的环境变量值是字符串$$DATABASE_CREDENTIALS,而非Secret Manager中的密钥内容。同时,$$在shell中会被解析为当前进程ID(PID),这也不是你想要的结果。

修正方案

有两种可靠的写法可以解决这个问题:

方案1:直接传递环境变量

docker支持直接通过--env <变量名>的方式,从当前shell环境中继承变量值,无需显式赋值。修改后的args部分如下:

args     = ["-c", "/workspace/cloud_sql_proxy -dir=/workspace -instances='${var.cloud_sql_connection_name}' & sleep 3 && docker run -v /workspace:/root --env DATABASE_CREDENTIALS '$FOOBAR_IMG'"]

方案2:显式赋值(正确转义)

如果需要显式赋值,要使用双引号让shell解析变量,同时在Terraform中用$$转义为单个$,确保shell能正确引用注入的环境变量:

args     = ["-c", "/workspace/cloud_sql_proxy -dir=/workspace -instances='${var.cloud_sql_connection_name}' & sleep 3 && docker run -v /workspace:/root --env DATABASE_CREDENTIALS=\"$$DATABASE_CREDENTIALS\" '$FOOBAR_IMG'"]

补充说明

  • secret_env = ["DATABASE_CREDENTIALS"]已经正确将Secret Manager中的密钥注入到该CloudBuild步骤的环境变量中,无需额外调整权限(你已确认权限配置正确)。
  • 使用sh -c时,变量的转义需要兼顾Terraform的字符串插值规则和shell的变量解析规则:Terraform中$$会被输出为单个$,这样shell就能识别$DATABASE_CREDENTIALS并读取环境变量值。

内容的提问来源于stack exchange,提问作者XaxD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:28:29