首页 > 解决方案 > 用于合并文件的 Helm Go 模板

问题描述

给出一组 JSON 文件,其中包含以下简化数据:file1.json:

{ "name" : "file1" }

文件2.json:

{ "name" : "file2" }

等等。我想创建一个配置映射,最终将这些文件的内容组合成一个 JSON 映射,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: jsondata
data:
  jsondata: |-
    {
      "file1":  { "name" : "file1" },
      "file2":  { "name" : "file2" }
    }

请注意,最后一项不应跟逗号。如果我创建如下所示的模板 yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: jsondata
data:
  jsondata: |-
    {
{{- $root := . }}
{{- range $path, $bytes := .Files.Glob "data/json/*.json" }}
  {{ base $path | replace ".json" "" | quote | indent 4 }}:
  {{ $root.Files.Get $path | indent 6 }}
  {{- "," }}
{{- end }}
    }

我最终在file2元素之后多了一个逗号,这破坏了 json 语法。

如何遍历文件并知道我在哪里(第一个或最后一个),以便我可以控制是否插入逗号?我试图弄清楚如何将glob结果的键放入列表中,以便我可以使用firstrest,但无法弄清楚 go 模板中的语法是什么。

这不是使用 go-templates 中的范围检测数组中的最后一项,除非您可以展示如何将 glob 结果放入具有索引的数组中。glob 结果没有索引,它是文件名/字节的字典。

更新:嗯,我猜这个问题已经死了,因为它被错误地标记为“重复”。遗憾的是,该系统具有这种关闭某些东西的方式,而实际上它并不是真正的副本。

对于那些真正需要解决这样的问题并且在简单列表上工作的“重复”的基本无关链接没有帮助的人的利益,这里有一个解决方案:

data:
  appdata: |-
    {
      {{- $candidates := .Files.Glob "data/json/*.json" -}}
      {{- $valuesJson := toJson $candidates -}}
      {{- $filesMap := fromJson $valuesJson -}}
      {{- $outputMap := dict -}}
      {{- range $index, $filename := keys $filesMap -}}
        {{- $fileContents := $.Files.Get $filename -}}
        {{- $fileContentMap := fromJson $fileContents -}}
        {{- $contentName := pluck "name" $fileContentMap | first -}}
        {{- $_ := set $outputMap $filename $contentName -}}
      {{- end -}}
      {{- range $index, $filename := keys $outputMap -}}
        {{- if ne $index 0 -}}
          ,
        {{- end -}}
        {{- pluck $filename $outputMap | first | printf "%q:" | nindent 6 -}}
        {{- $.Files.Get $filename | nindent 8 -}}
      {{- end }}
    }

标签: templatesgokuberneteskubernetes-helm

解决方案


推荐阅读