【问题标题】:How can I use a json file in my configmap.yaml (Helm)?如何在我的 configmap.yaml (Helm) 中使用 json 文件?
【发布时间】:2021-02-16 02:45:05
【问题描述】:

我正在使用 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 图表目录中,在 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 文件中?

【问题讨论】:

    标签: kubernetes kubernetes-helm configmap


    【解决方案1】:

    .Files 对象在 Helm Built-in Objects 文档中进行了描述。 .Files.Glob 返回匹配某些模式的文件列表,例如 *.json;您可能希望 .Files.Get 返回文件内容。

    YAML 对空格处理和缩进也非常敏感。当您检索文件时,您可能希望该行从第一列开始,然后调用indent 函数,其编号比前一行的缩进级别多。这也会缩进第一行,您可以通过 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 */}}
    

    【讨论】:

    • 谢谢!如果我希望 json 文件依赖于 values.yaml 中的变量,有没有办法做到这一点?目前我已经尝试过:{{ .Files.Get "{{ .Values.app.config }}.json" | indent 4}},但据我所知,这会返回一个空配置。
    • 一旦你在花括号内,你就是在模板语言中,所以你不需要更多的花括号。但是尝试{{ .Files.Get (printf "%s.json" .Values.app.config) | indent 4 }} 从变量中填充它。
    • 你救了我。恕我直言,官方文档中的示例完全具有误导性:helm.sh/docs/chart_template_guide/accessing_files 他们使用 3 个文件,只有一行,这意味着整个缩进问题不会出现,您最终会认为 helm 会自动缩进文件的内容..我认为应该修改官方文档以使用至少2行的文件,以便可以讨论缩进处理问题
    • 文档只提到使用.Files.Lines,但并没有真正明确地说要这样做来处理缩进。而且它可能效率较低(?)。
    • 我试过{{ .Files.Get (printf "%s.json" .Values.app.config) | indent 4 }},但它返回空配置
    【解决方案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!
    

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 2019-03-26
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多