Deployment.yaml 使用 sed 替换模板文件字符串,所有与环境变量 $_<pattern> 匹配的模式

Deployment.yaml Template file string substitution with sed, all that match a pattern with env var $_<pattern>

我有一个如下所示的 kubernetes 部署模板

[...other stuff...]
data:
  ENV_VAR_1: _ENV_VAR_1
  ENV_VAR_2: _ENV_VAR_2
  ENV_VAR_ETC: _ENV_VAR_ETC

我想指示我的 cloudbuild.yaml 将出现的 _SOME_THING 替换为环境变量 $_SOME_THING 的实际值。我知道我可以执行 Bash 命令所以我用 sed:

试了一下
# \x27 is the character '
entrypoint: 'bash'
    args:
      - '-eEuo'
      - 'pipefail'
      - '-c'
      - |-
        sed -n 's%\([A-Z][A-Z_0-9]*\):[[:space:]]*_[[:space:]]*$%sed -i \
        \x27s;_[[:space:]]*$;\x27$_\x27;g\x27 $_K8S_YAML_FILE%gp' \
        $_K8S_YAML_FILE | sh

想法是为每个变量生成替换命令,然后将它们通过管道传输到 shell。生成的命令看起来不错:

sed -i 's;_ENV_VAR_1[[:space:]]*$;'$_ENV_VAR_1';g' $_K8S_YAML_FILE
sed -i 's;_ENV_VAR_2[[:space:]]*$;'$_ENV_VAR_2';g' $_K8S_YAML_FILE
sed -i 's;_ENV_VAR_ETC[[:space:]]*$;'$_ENV_VAR_ETC';g' $_K8S_YAML_FILE

当我在 git bash 中执行它时,在使用 export 设置环境变量后,整个过程都有效,但是当通过 cloudbuild.yaml 文件执行它时修改成这样:

[...other stuff...]
data: 
  ENV_VAR_1: 1
  ENV_VAR_2: 1
  ENV_VAR_ETC: 1

我想我遗漏了一些转义符,或者传递给 bash (-eEuo) 的命令行选项把事情搞砸了,但我不知道。任何解决方案,即使不使用 sed 来完成任务(但不需要安装额外的工具)也将不胜感激。谢谢。

我得出结论,我想要实现的目标是不可能的。如上所述通过 cloudbuild 启动 shell 并尝试打印环境变量(通过 printenv)和 shell 变量(set -o posix ; set)不显示我的任何变量,即设置为触发器替换。据我所知,这实际上可能就是名称所说的那样,即在处理实际文件之前对其执行的字符串替换。证据表明,如果不直接将它们写入文件,我就无法提取这些参考的价值。任何建立参考然后对其进行评估的策略都失败了。我采用的最终解决方案是 envsubst cloudbuilder (https://github.com/GoogleCloudPlatform/cloud-builders-community/tree/master/envsubst),将每个变量从文件传播到 shell (env: ['_MY_VAR=$_MYVAR', ...])