Helm模板渲染JSON时如何移除算术表达式的双引号
Helm生成ConfigMap时保留算术表达式的无引号格式
问题场景
使用Helm构建Kubernetes ConfigMap时,遇到以下问题:
当前配置
- Helm ConfigMap模板:
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-config {{- include "commonMeta" . | nindent 2 }} data: config.play.ts: | const config = {{ tpl (.Values.app.play | mustToPrettyJson) $ | indent 6 }} export default config;
- values.yaml配置:
play: PORT: 1114 PLAY_EXPIRES_IN_MS: 10 * 60 * 1000 API_URL: "https://stag.com/api"
问题现象
执行helm template后,PLAY_EXPIRES_IN_MS对应的算术表达式10 * 60 * 1000被JSON序列化为带双引号的字符串"10 * 60 * 1000",但我们需要保留无引号的算术表达式形式,且不能依赖固定值的replace操作(值未来可能变化)。
解决方案
放弃直接用mustToPrettyJson序列化,改用Helm模板的遍历+正则判断逻辑,动态处理不同类型的配置值:
方案1:直接在模板中处理
修改ConfigMap的data部分为以下内容:
data: config.play.ts: | const config = { {{- range $key, $val := .Values.app.play }} {{ $key }}: {{- if or (kindIs "int" $val) (kindIs "float64" $val) }} {{ $val }} {{- else if eq (typeOf $val) "string" }} {{- if regexMatch "^[0-9\\s\\+\\-\\*/()]+$" $val }} {{ $val }} {{- else }} "{{ $val }}" {{- end }} {{- end }}, {{- end }} }; export default config;
方案2:封装为自定义模板函数(更易维护)
- 在
templates/_helpers.tpl中添加自定义函数:
{{/* 处理TS配置值:数值直接输出,算术表达式字符串去引号,普通字符串保留引号 */}} {{- define "tsConfigValue" -}} {{- if or (kindIs "int" .) (kindIs "float64" .) }} {{ . }} {{- else if eq (typeOf .) "string" }} {{- if regexMatch "^[0-9\\s\\+\\-\\*/()]+$" . }} {{ . }} {{- else }} "{{ . }}" {{- end }} {{- end }} {{- end -}}
- 在ConfigMap模板中调用该函数:
data: config.play.ts: | const config = { {{- range $key, $val := .Values.app.play }} {{ $key }}: {{ include "tsConfigValue" $val }}, {{- end }} }; export default config;
逻辑说明
- 对数值类型(int/float64):直接输出值,不加引号
- 对字符串类型:通过正则判断是否为算术表达式(仅包含数字、空格、
+/-/*///(/)),是则直接输出,否则保留双引号 - 可根据需求扩展正则表达式,比如添加
%支持取模运算
内容的提问来源于stack exchange,提问作者Tenzin Lama
相关产品推荐
相关产品推荐

