如何用yq命令仅更新YAML中bar图表的image.tag值?
问题:仅更新YAML中name为bar的图表对应的image.tag值
原YAML内容:
releases: - chart: ../charts/foo name: foo namespace: '{{ .Values.stack }}' values: - ../config/templates/foo-values.yaml.gotmpl set: - name: image.tag value: 22 - name: replicas value: 1 - chart: ../charts/bar name: bar namespace: '{{ .Values.stack }}' values: - ../config/templates/bar-values.yaml.gotmpl set: - name: image.bar_proxy.tag value: 46 - name: image.bar.tag value: 29 - name: replicas value: 1
需求:仅修改releases列表中name为bar的条目对应的镜像tag值,但执行命令yq -y '.releases[].set |= map(select(.name == "image.tag").value=51)' yaml时,会同时修改foo和bar的相关值,需要正确的yq命令。
正确的yq命令
根据原YAML结构,bar条目对应的镜像tag是image.bar.tag,正确命令如下:
yq -y '.releases[] |= (select(.name == "bar") | .set |= map(select(.name == "image.bar.tag").value = 51))' your-file.yaml
如果你的实际需求是给bar条目新增/修改通用的image.tag项,命令调整为:
yq -y '.releases[] |= (select(.name == "bar") | .set |= (map(select(.name != "image.tag")) + [{name: "image.tag", value: 51}]))' your-file.yaml
命令说明
.releases[] |= ...:遍历所有release条目,仅对匹配的条目执行修改select(.name == "bar"):精准筛选出目标条目,避免影响foo等其他条目.set |= map(...):在目标条目的set数组中,定位到指定名称的项并更新其值
内容的提问来源于stack exchange,提问作者Dilip
相关产品推荐
相关产品推荐

