You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Helm模板使用Range复制Values.yaml结构至ConfigMap失败排查

问题:Helm模板range遍历YAML结构时输出map字符串而非原格式

问题场景

你的原始values.yaml配置是这样的:

documentStorage:
  folders:
    TEST1:
      permissions:
        read: "test1@email.com"
        write: "test1@email.com"
    TEST2:
      permissions:
        read: "test2@email.com"
        write: "test2@email.com"

你尝试用Helm模板的range功能将其迁移到ConfigMap,编写的模板代码如下:

documentStorage:
  folders:
    {{- range $folder, $structure := .Values.global.documentStorage.folders }}
    {{ $folder }}: {{ $structure }}
    {{- end}}

但生成的结果不符合预期,permissions被转换成了字符串形式的map:

folders:
  TEST1:
    permissions: map[read:test1@email.com write:test1@email.com]
  TEST2:
    permissions: map[read:test2@email.com write:test2@email.com]

问题原因

Helm渲染模板时,若直接输出Go map类型的变量(比如这里的$structure),默认会调用Go的格式化逻辑将其转为字符串形式,也就是你看到的map[read:... write:...],而非保持原有的YAML嵌套结构。

解决方案

你需要借助Helm提供的toYaml函数将map转换为标准YAML字符串,同时配合indent函数维持正确的缩进层级,这样就能完美复刻原始配置的结构。

修正后的模板代码:

documentStorage:
  folders:
    {{- range $folder, $structure := .Values.global.documentStorage.folders }}
    {{ $folder }}:
{{ toYaml $structure | indent 6 }}
    {{- end}}

代码解释

  1. toYaml $structure:将$structure这个Go map转换成符合YAML规范的字符串,保留嵌套层级。
  2. indent 6:为转换后的YAML字符串添加6个空格的缩进,确保它和{{ $folder }}:的层级匹配——原始结构中permissions是TEST1的子节点,需要在TEST1:的基础上再缩进2个空格,加上TEST1:本身的4个空格(含冒号),总共6个空格的缩进。

正确生成结果

应用修正后的模板后,生成的配置会和原始values.yaml结构完全一致:

documentStorage:
  folders:
    TEST1:
      permissions:
        read: "test1@email.com"
        write: "test1@email.com"
    TEST2:
      permissions:
        read: "test2@email.com"
        write: "test2@email.com"

内容的提问来源于stack exchange,提问作者Manuelarte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:03:30