Mat*_*ans 5 templates go kubernetes kubernetes-helm
以一组 JSON 文件形式给出,其中包含以下简化数据:file1.json:
{ "name" : "file1" }
Run Code Online (Sandbox Code Playgroud)
文件2.json:
{ "name" : "file2" }
Run Code Online (Sandbox Code Playgroud)
等等。我想创建一个配置映射,最终将这些文件的内容组合成一个 JSON 映射,如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: jsondata
data:
jsondata: |-
{
"file1": { "name" : "file1" },
"file2": { "name" : "file2" }
}
Run Code Online (Sandbox Code Playgroud)
请注意,最后一项后面不应跟逗号。如果我创建如下所示的模板 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 }}
}
Run Code Online (Sandbox Code Playgroud)
我在file2元素后面多了一个逗号,这破坏了 json 语法。
如何迭代文件并知道我在哪里(第一个或最后一个),以便我可以控制是否插入逗号?我试图弄清楚如何将glob结果的键放入列表中,以便我可以使用first和rest,但无法弄清楚 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 }}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2620 次 |
最近记录: |