Helm:范围函数没有按预期保持输入值的顺序?
Helm: the range function is not keeping the input values in order as expected?
我知道,词典是按顺序处理的。但是,出于某些流程目的,我需要按某种顺序 运行 特定流程。 (由于原生 k8s 不会按顺序支持 cronjobs,所以我在单个 pod 的入口点执行它)。
下面是我的values.yaml
batches:
evaluate_events:
ev-cron-3:
populate_data:
event-name: "Populate Data process"
business-process: "Generic"
rule-type: "Identification"
auth_export:
event-name: "Auth Export Ruleset"
business-process: "Generic"
rule-type: "Constraint Satisfaction"
new_document_attached:
event-name: "New Document Attached"
business-process: "Generic"
rule-type: "Constraint Satisfaction"
我的代码 inv k8s yaml:
{{- range $event, $data := $.Values.batches }}
{{- range $key, $cron := $data }
{{- range $jobname, $inputs := $cron }}
- '{{ $event }} {{- range $args, $val := $inputs }} --{{ $args }} "{{ $val }}" {{- end }}'
{{- end }}
{{- end }}
{{- end }}
预期输出:与 values.yaml
中的顺序相同
- 'evaluate_events --business-process "Generic" --event-name "Populate Data process" --rule-type "Identification"'
- 'evaluate_events --business-process "Generic" --event-name "Auth Export Ruleset" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "New Document Attached" --rule-type "Constraint Satisfaction"'
实际输出:不符合 values.yaml
的顺序
- 'evaluate_events --business-process "Generic" --event-name "Auth Export Ruleset" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "New Document Attached" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "Populate Data process" --rule-type "Identification"'
需要,有没有人处理过这种情况?以及如何实现?
您正在 values.yaml
中使用 YAML 地图对象。这由成对的键和值组成,但不一定按任何顺序排列。您可能需要一个 YAML 列表:
- arg: event-name
value: Populate Data process
- arg: business-process
value: Generic
- arg: rule-type
value: Identification
然后您可以使用 range
:
遍历列表(不是地图)
- '{{ $event }}
{{- range $inputs }} --{{ .arg }} "{{ .value }}"{{- end -}}
'
出于这个原因,Kubernetes 中的几个地方都有带有 name
字段的列表,您也可以考虑在您的价值结构中使用这种方法。如果您控制应用程序本身,您可能还会发现将这些设置作为环境变量而不是 command-line 参数传递会更容易,因为如您所示构造命令字符串在语法上可能有点棘手。
我知道,词典是按顺序处理的。但是,出于某些流程目的,我需要按某种顺序 运行 特定流程。 (由于原生 k8s 不会按顺序支持 cronjobs,所以我在单个 pod 的入口点执行它)。 下面是我的values.yaml
batches:
evaluate_events:
ev-cron-3:
populate_data:
event-name: "Populate Data process"
business-process: "Generic"
rule-type: "Identification"
auth_export:
event-name: "Auth Export Ruleset"
business-process: "Generic"
rule-type: "Constraint Satisfaction"
new_document_attached:
event-name: "New Document Attached"
business-process: "Generic"
rule-type: "Constraint Satisfaction"
我的代码 inv k8s yaml:
{{- range $event, $data := $.Values.batches }}
{{- range $key, $cron := $data }
{{- range $jobname, $inputs := $cron }}
- '{{ $event }} {{- range $args, $val := $inputs }} --{{ $args }} "{{ $val }}" {{- end }}'
{{- end }}
{{- end }}
{{- end }}
预期输出:与 values.yaml
中的顺序相同- 'evaluate_events --business-process "Generic" --event-name "Populate Data process" --rule-type "Identification"'
- 'evaluate_events --business-process "Generic" --event-name "Auth Export Ruleset" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "New Document Attached" --rule-type "Constraint Satisfaction"'
实际输出:不符合 values.yaml
的顺序- 'evaluate_events --business-process "Generic" --event-name "Auth Export Ruleset" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "New Document Attached" --rule-type "Constraint Satisfaction"'
- 'evaluate_events --business-process "Generic" --event-name "Populate Data process" --rule-type "Identification"'
需要,有没有人处理过这种情况?以及如何实现?
您正在 values.yaml
中使用 YAML 地图对象。这由成对的键和值组成,但不一定按任何顺序排列。您可能需要一个 YAML 列表:
- arg: event-name
value: Populate Data process
- arg: business-process
value: Generic
- arg: rule-type
value: Identification
然后您可以使用 range
:
- '{{ $event }}
{{- range $inputs }} --{{ .arg }} "{{ .value }}"{{- end -}}
'
出于这个原因,Kubernetes 中的几个地方都有带有 name
字段的列表,您也可以考虑在您的价值结构中使用这种方法。如果您控制应用程序本身,您可能还会发现将这些设置作为环境变量而不是 command-line 参数传递会更容易,因为如您所示构造命令字符串在语法上可能有点棘手。