如何使用jq合并Kubernetes Pod JSON配置并追加数组内容
实现Kubernetes配置文件数组字段的追加合并
方法一:用jq(推荐,适配你原有的操作)
原命令的*运算符会直接覆盖数组,要实现追加,得对指定字段单独处理,其他字段保持覆盖逻辑:
jq -s ' .[0] * .[1] | .command = (.[0].command // []) + (.[1].command // []) | .volumeMounts = (.[0].volumeMounts // []) + (.[1].volumeMounts // []) | .volumes = (.[0].volumes // []) + (.[1].volumes // []) ' kube-apiserver.json patch.json > patched-apiserver.json
说明:
.[0] * .[1]先让patch的非数组字段覆盖原文件对应字段// []用来处理字段不存在的情况,避免null导致数组拼接失败- 针对
command、volumeMounts、volumes三个字段,把原文件和patch的数组内容拼接起来
方法二:用Python脚本
写个简单脚本,能灵活控制合并逻辑,适合后续要扩展更多字段的场景:
import json # 定义需要追加的数组字段 ARRAY_FIELDS = ["command", "volumeMounts", "volumes"] # 读取两个配置文件 with open("kube-apiserver.json", "r") as f: original = json.load(f) with open("patch.json", "r") as f: patch = json.load(f) # 先让patch覆盖原文件的非数组字段 merged = original.copy() merged.update(patch) # 处理数组字段的追加 for field in ARRAY_FIELDS: # 原文件和patch都有该数组字段,就把patch的内容追加到原数组后面 if field in original and isinstance(original[field], list): if field in patch and isinstance(patch[field], list): merged[field] = original[field] + patch[field] # 原文件没有该字段,patch有,就直接用patch的内容 elif field in patch: merged[field] = patch[field] # 写入合并后的文件 with open("patched-apiserver.json", "w") as f: json.dump(merged, f, indent=2)
运行脚本:
python3 merge_configs.py
方法三:用yq(若已安装,支持JSON/YAML通用处理)
如果你的环境装了yq(v4版本),可以用它处理JSON,逻辑和jq类似:
yq eval-all ' . as $item ireduce ({}; . * $item | .command = (.command // []) + ($item.command // []) | .volumeMounts = (.volumeMounts // []) + ($item.volumeMounts // []) | .volumes = (.volumes // []) + ($item.volumes // []) ) ' kube-apiserver.json patch.json > patched-apiserver.json
内容的提问来源于stack exchange,提问作者landocalrissian
相关产品推荐
相关产品推荐

