使用yq合并Kubernetes Helm YAML文件时动态生成内容报错求助
解决yq动态生成内容合并YAML的问题
你的问题出在yq的load()函数不支持Shell的进程替换语法<(...),它会把括号里的字符串当成普通文件名去尝试打开,自然找不到对应文件。以下是两种可行的解决方案:
方案1:用yq的eval-all批量处理多输入
针对mikefarah/yq(v4+,主流版本),可以用eval-all同时加载原values文件和动态生成的内容,再通过ireduce合并:
yq eval-all '. as $item ireduce ({}; . * $item)' ../web/values.yaml <(helm template -f values-prod.yaml -s templates/web.yaml . | yq '.spec.source.helm.values')
eval-all:告诉yq处理多个输入源ireduce:迭代所有输入,把每个输入的内容合并到初始空对象中<(...):Shell进程替换,生成的动态内容会被当作临时文件传给yq
方案2:通过管道传递动态内容合并
另一种更简洁的写法,把动态生成的内容通过管道传给yq,再和原文件合并:
helm template -f values-prod.yaml -s templates/web.yaml . | yq '.spec.source.helm.values' | yq eval '. *= input' ../web/values.yaml -
- 最后一个
-:表示yq从标准输入读取动态生成的内容 input:引用标准输入中的YAML内容,和../web/values.yaml的内容做深度合并(*=为深度合并运算符)
关键说明
不要试图把进程替换语法放进load()函数里——yq的load()仅支持本地文件路径或远程URL,不解析Shell的特殊语法,这是导致你报错的核心原因。
内容的提问来源于stack exchange,提问作者sebastianwth
相关产品推荐
相关产品推荐

