yq 内联替换会删除文件的其余部分

问题描述 投票:0回答:1

我有以下yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-backend
  labels:
    app: app-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-backend
  template:
    metadata:
      labels:
        app: app-backend
    spec:
      serviceAccountName: app
#      securityContext:
#          fsGroup: 1001090001        
      containers:
      - name: app-backend
        image: registry/import-proj/app_backend:dc47096c66513dc252b21398e0307efd021c7c8e
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: app-backend
        - secretRef:
            name: dbsecret
  strategy:
    type: Recreate                 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-frontend
  labels:
    app: app-frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-frontend
  template:
    metadata:
      labels:
        app: app-frontend
    spec:
      serviceAccountName: app
#      securityContext:
#          fsGroup: 1001090002    
      containers:
      - name: app-frontend
        image: registry/import-proj/app_frontend:c6e525b71e5c9480330431e55418ff15dcbe4f36
        ports:
        - containerPort: 3000

我正在尝试使用 yq 来替换 app_frontend 的标签

c6e525b71e5c9480330431e55418ff15dcbe4f36

我的命令如下-

yq eval-all -i 'select(.kind == "Deployment" and .metadata.name == "app-frontend") | .spec.template.spec.containers[] |= (select(.name == "app-frontend") | .image |= sub(":.*", ":new-tag"))' try.yaml

问题是,更换后后端部分完全消失了。 我尝试过使用

yq eval-all -i [] .|select(..
我不明白问题出在哪里。

replace yaml yq
1个回答
0
投票

使用

select(…) | .spec.template.spec.containers[]
中的管道会更改主要上下文。不用用,选择后继续遍历即可:

select(.kind == "Deployment" and .metadata.name == "app-frontend")
.spec.template.spec.containers[] |= (…)

使用 mikefarah/yq 版本 v4.35.1 进行测试

请注意,至少对于此示例输入,您不需要

ea
命令。
e
也可以完成这项工作(从 4.18.1 版本开始甚至可以省略)。

© www.soinside.com 2019 - 2024. All rights reserved.