Helm 图表模板:如何按原样渲染复杂结构

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

场景:我们有 2 个设置:

commonSettings
appSettings
。如果
commonSettings
appSettings
中都存在某个键,则
appSettings
中的一个会覆盖另一个。

问题:

Logging:
的复杂结构值被渲染为
map[Name:Test]
而不是
{ "Name": "Test" }
。更多详情如下。

有人可以在这方面帮助我吗?谢谢你。

{{- define "settings" }}
{{ range $k, $v := .Values.appSettings }}
{{ $k }}: {{ $v }}
{{ end }}
{{ range $k, $v := .Values.commonSettings }}
{{ if (not (hasKey $.Values.appSettings $k)) }}
{{ $k }}: {{ $v }}
{{ end }}
{{ end }}
{{- end }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: test-configmap
  labels:
    app: test-app
data:
  appSettings.json: |-
  
{{- include "settings" . | fromYaml | toPrettyJson | nindent 4 }}

Values.yaml

commonSettings:
  {
    "Color": "Green",
    "Make": "Toyota"
  }
  
appSettings:
  {
    "Color": "Red",
    "Logging": {
      "Name": "Test"
    },
    "Model": "Highlander"
  }

实际产量:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-configmap
  labels:
    app: test-app
data:
  appSettings.json: |-
    {
      "Color": "Red",
      "Logging": "map[Name:Test]",
      "Make": "Toyota",
      "Model": "Highlander"
    }

预期输出:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-configmap
  labels:
    app: test-app
data:
  appSettings.json: |-
    {
      "Color": "Red",
      "Logging": {
        "Name": "Test"
      },
      "Make": "Toyota",
      "Model": "Highlander"
    }
go-templates helm3
1个回答
0
投票

我能够找到适合我情况的解决方案。我可以使用

merge
。以下是完整示例,您可以粘贴到
https://helm-playground.com/
中自行尝试。

configmap.yaml

---
apiVersion: v1
kind: ConfigMap
metadata:
name: rpwebservice-configmap
namespace: rpwebservice
labels:
    app: rpwebservice
data:
  appSettings.json: |-
  {{- $dict := merge .Values.appSettings .Values.commonSettings }}
  {{- $dict | toYaml | fromYaml | toPrettyJson | nindent 4}}
© www.soinside.com 2019 - 2024. All rights reserved.