我有一个包含以下内容的values.yaml:
abc:
env:
- name: name01
value: value01
- name: name02
value: value02
我还有另一个值文件values-dev.yaml,我在使用-f安装时添加它,它有:
abc:
env:
- name: name03
value: value03
并使用范围将它们列在我的模板中。我希望应用两个文件后列表会变成这样:
abc:
env:
- name: name01
value: value01
- name: name02
value: value02
- name: name03
value: value03
但是values-dev.yaml 值将覆盖values.yaml 中的值,它会变成:
abc:
env:
- name: name03
value: value03
如何实现合并这两个具有来自不同值文件的相同字段名称的列表?
简短的回答是,您无法合并
lists
。
在您的情况下,
abc.env
是key
,value
是一个列表。让我用等效的符号重写您的第一个值文件,它会更清晰:
abc:
env: [{name: name01, value: value01}, {name: name02, value: value02}]
因此 Helm 正在执行预期的操作,用最后提供的键覆盖键
abc.env
。
解决方案是重新构建您的值文件,如下所示:
abc:
env:
name01: value01
name02: value02
这样,您可以根据需要合并和覆盖您的值文件。这样,使用命令行标志覆盖单个值也很容易,例如:
--set abc.env.name01=different
借助一些 Helm 魔法,可以轻松地将这些值作为环境变量传递到您的 pod:
...
containers:
- name: abc
image: abc
env:
{{- range $key, $value := .Values.abc.env }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
这可能并不总是您想要的行为,但您可以在 helm 中连接两个或多个列表,而无需任何复杂的模板。只需使用列表中的
concat
函数即可:
apiVersion: v1
kind: Pod
metadata:
name: wget
labels:
app.kubernetes.io/name: wget
app.kubernetes.io/instance: wget
app.kubernetes.io/managed-by: Helm
spec:
containers:
- name: wget
image: busybox
command: ['sleep']
args: ['7d']
volumes:
{{- toYaml (concat .Values.volumes .Values.defautVolumes) | nindent 4 }}
这会添加两个列表
volumes
和 defautVolumes
。空列表也有效。
注意: 这不会减少磁盘空间。如果两个列表具有相同的值,它会产生重复项。您不能使用它来用另一个列表覆盖一个列表中的值。