Helm 图表:合并字典,仅允许其中之一存在的键

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

在舵图中 - 我有 2 个字典,一个是静态的,另一个是动态的 我想合并这两个字典,以便动态值替换静态值,但我不想让动态字典将没有静态值的键添加到生成字典中

例如 - 词典 1:

{{ $static := dict "FIRST_NAME" "first" "LAST_NAME" "last" }}
{{ $dynamic := dict "FIRST_NAME" "John" "KEY_TO_REMOVE" "something" }}
...
data:
{{ merge $dynamic $static | toYaml | indent 2}}

结果:

...
data:
  FIRST_NAME: John
  LAST_NAME: last
  KEY_TO_REMOVE: something

我希望它的结果是:

...
data:
  FIRST_NAME: John
  LAST_NAME: last

我可以通过使用

range
index
的组合来循环遍历合并的字典并仅打印
$static
中存在的项目来实现此目标,但我正在寻找一种更干净的“一行”解决方案

kubernetes-helm go-templates
1个回答
0
投票

我认为如果不手动迭代其中一本字典,这是不可能的。

在这种情况下,我可以通过使用

range
迭代静态字典并一次发出一个键来完成此操作,而不尝试专门生成结果对象作为变量。

data:
{{- range $key, $sv := range $static }}
  {{ $key }}: {{ get $dynamic $key | default $sv | toJson }}
{{- end }}

(这样写有很多实际问题:

$dynamic
中的空值将被忽略;这是只考虑顶级键的浅层合并;我已经避免了一些潜在棘手的引用问题。)

Helm 在内部使用 Sprig 支持库来实现其大部分扩展。这里的问题在于可用的字典函数集。我可以从

keys
中获取
$static
,并且可以从
pick
中获取
$dynamic
特定值,但是
pick
采用一组静态键作为位置参数;你无法注入列表。

{{/* sadly not an option */}}
{{- $filtered := keys $static | xargs pick $dynamic -}}

如果

$static
真的那么静态,那么你可以使用
pick
,但我猜实际上并非如此。

{{/* will work iff you know exactly the keys of $static in code */}}
{{ $static := dict "FIRST_NAME" "first" "LAST_NAME" "last" }}
{{ $dynamic := dict "FIRST_NAME" "John" "KEY_TO_REMOVE" "something" }}
{{ $filtered := pick $dynamic "FIRST_NAME" "LAST_NAME" }}
data:
{{ merge $filtered $static | toYaml | indent 2}}
© www.soinside.com 2019 - 2024. All rights reserved.