场景:我们有 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"
}
我能够找到适合我情况的解决方案。我可以使用
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}}