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', ...]
)
我有一个如下所示的 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', ...]
)