如何在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
相关产品推荐
相关产品推荐

