如何在 configmap.yaml (Helm) 中使用 json 文件?

How can I use a json file in my configmap.yaml (Helm)?

我正在使用 Helm 部署到 Kubernetes 集群。我研究了 configmap,发现可以从文件中检索数据并将其放入 configmap。

我有以下 configmap.yaml:

kind: ConfigMap 
apiVersion: v1 
metadata:
  name: {{ .Values.app.configMap }}
  namespace: {{ .Values.app.namespace }}
data:
    config.json: |-
      {{ .Files.Glob "my-config.json" | indent 2}}

并且我的 deployment.yaml 包含相关的 volumeMount(如果我将实际 json 数据直接放入 configmap.yaml 然后配置部署)。我的 configmap.yamldeployment.yaml 都保存在 /chart/templates 中,但我将 my-config.json 保存在基本 helm chart 目录中,在 templates 文件夹之外。

当我尝试使用图表进行部署时,出现以下错误:

Error: template: chart/templates/configmap.yaml:8:54: executing "chart/templates/configmap.yaml" at <2>: wrong type for value; expected string; got engine.files

如何在我的 configmap 中使用 .json 文件而不将原始 json 数据直接放入 yaml 文件?

Helm Built-in Objects 文档中描述了 .Files 对象。 .Files.Glob returns 匹配某种模式的文件列表,如 *.json;您可能想要 .Files.Get 而不是 return 文件内容。

YAML 对空格处理和缩进也非常敏感。当您检索文件时,您可能希望该行从第一列开始,但随后调用 indent 函数时使用比上一行的缩进级别多的数字。这也缩进了第一行,你可以 double-check 和 helm template 正确的结果出来了。

data:
  {{-/* Note, indent of only two spaces */}}
  config.json: |-
{{ .Files.Get "my-config.json" | indent 4 }}
{{/* .Get, not .Glob; indent 4 spaces, more than 2 above */}}

还有 2 种其他方法可以包含文件并正确缩进其内容:

  1. 如前所述逐行包含它in the documentation:

    data:
      key: |
        {{- range .Files.Lines "myfile.txt" }}
        {{ . }}{{ end }}
    

    每一行都会重复此模板,因此每一行都会有 4 个空格的正确缩进。

  2. 使用 {{- 删除初始空格并在模板中引入显式换行符:

    data:
      key: |
        {{- "\n" }}
        {{- .Files.Get "myfile.txt" | indent 4 }}
    

这两种解决方案都会产生:

data:
  key: |
    contents of
    myfile.txt!