如何让Helm生成的ConfigMap中CSV格式与oc命令创建的一致?
Helm生成ConfigMap与oc命令格式不一致的解决方法
差异原因
- Helm 内置的
.Files.Glob.AsConfig方法默认使用YAML|-块标量格式渲染文件内容,会自动把内容处理为逐行缩进的块级文本,不会保留\r\n转义换行,也不会输出双引号包裹的单行字符串格式。 oc create configmap --from-file会直接读取文件原始字节内容,当内容包含CRLF(\r\n)这类特殊字符时,会自动以双引号包裹的转义字符串格式输出到ConfigMap的data字段,二者的默认序列化逻辑不同导致格式差异。
调整模板的具体方法
弃用默认的.AsConfig渲染方法,手动遍历文件、处理内容格式,修改后的模板如下:
apiVersion: v1 kind: ConfigMap metadata: name: service-config namespace: {{ .Values.namespace }} labels: app: {{ .Values.appname }} data: {{- $fileRoot := printf "%s/application-config/*" .Values.env }} {{- range $filePath, $fileContent := (.Files.Glob $fileRoot) }} {{ base $filePath }}: {{ $fileContent | replace "\n" "\r\n" | toJson }} {{- end }}
模板逻辑说明
- 直接遍历
Files.Glob匹配到的文件,不调用内置的AsConfig序列化方法,避免Helm自动做块标量格式化 base $filePath提取文件原名作为data字段的key,和原AsConfig的key生成规则一致replace "\n" "\r\n"将Unix风格的LF换行符替换为oc输出中使用的CRLF(\r\n)换行符,对齐换行格式toJson会自动将处理后的字符串序列化为双引号包裹、特殊字符自动转义的标准字符串格式,和oc命令生成的value格式完全一致
注意:如果你的CSV源文件本身就是Windows格式、自带
\r\n换行,可以去掉replace "\n" "\r\n"这一步,直接使用{{ $fileContent | toJson }}即可,避免重复插入\r字符导致内容异常。
渲染后生成的ConfigMap对应字段会和oc命令生成的格式完全一致:CSV内容为双引号包裹、使用\r\n作为转义换行的单行字符串,无块级缩进格式。
内容的提问来源于stack exchange,提问作者Chandresh Mishra
相关产品推荐
相关产品推荐

