You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:20:33