GCP Cloud Build使用Secret Manager密钥时环境变量替换异常
问题诱因
Cloud Build 中对$$标识的机密变量的解析替换逻辑,仅会在 bash 的-c参数后的命令字符串中生效。你在第二步直接将$$USERNAME、$$PASSWORD作为独立参数传给脚本时,Cloud Build 不会对这类非-c包裹的参数做变量替换,最终传到脚本里的是$USERNAME、$PASSWORD的字面量字符串,而非实际的机密值。
另外你首次 docker login 报错还有一个配置问题:你查询SECRET1的输出值为Secret2Value,和SECRET2值相同,说明你可能把密码存错到了对应Secret条目中,或者调用的版本不对,也会导致账号校验失败。
修复方案
两种方案二选一即可:
方案1:用-c包裹脚本调用
让脚本调用逻辑放在-c的命令字符串中,触发Cloud Build的变量替换逻辑,修改第二步配置如下:
- name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'cloudbuilds/script.sh $$USERNAME $$PASSWORD'] secretEnv: ['USERNAME', 'PASSWORD']
方案2:脚本直接读取环境变量(更推荐)
secretEnv配置已经将机密注入到当前步骤的bash全局环境中,不需要作为参数传递,直接在脚本中读取即可:
修改yaml第二步配置:
- name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['cloudbuilds/script.sh'] secretEnv: ['USERNAME', 'PASSWORD']
修改script.sh内容:
#!/bin/bash secretVar1="$USERNAME" secretVar2="$PASSWORD" printf "\n\nVARIABLES\nSecret1: $secretVar1\nSecret2: $secretVar2\n\n"
配置修改完成后,确认Secret Manager中SECRET1、SECRET2存储的是正确的docker用户名、密码对应的值即可正常运行。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

