Jsonnet:如何在for循环内多次应用mixin实现多VolumeMount
解决Jsonnet中为Deployment批量添加VolumeMount的问题
首先修正几个核心问题:
- mountConfig结构:你当前定义的是带键的对象,需要转为数组(或用
std.objectValues遍历对象值) - ConfigMap数据合并:不能直接用
for循环拼接withData,需合并所有配置数据后一次性注入 - Deployment批量挂载:Jsonnet不支持直接
+ mixin for ...的语法,需用std.foldl累加多个mixin
完整修正代码
local k = import 'kausal.libsonnet'; local configMap = k.core.v1.configMap; local deployment = k.apps.v1.deployment; local container = k.core.v1.container; config: { mountConfig: [ { mountPath: '/path/to/first', subPath: 'first', data: { 'first.conf': 'foo=bar' }, }, { mountPath: '/path/to/second', subPath: 'second', data: { 'second.conf': 'baz=qux' }, }, ], } // 合并所有配置数据生成ConfigMap configMap: configMap.new('config') + configMap.withData( std.mergeObjects([cfg.data for cfg in $.config.mountConfig]) ), // 用std.foldl批量添加VolumeMount deployment: std.foldl( (dep, cfg) => dep + k.util.configMapVolumeMount($.configMap, cfg.mountPath, cfg.subPath), // 初始Deployment对象 deployment.new( name='dep1', replicas=2, // Kubernetes要求replicas为整数类型 containers=[container.new('name', 'image')] ), $.config.mountConfig ),
关键语法说明
std.foldl:用于遍历数组并累加结果,第一个参数是累加函数(接收当前对象和遍历元素),第二个是初始值,第三个是遍历的数组。这里把每个configMapVolumeMount生成的mixin依次叠加到初始Deployment上。std.mergeObjects:把多个data对象合并成一个,避免多次调用withData。- 如果要保留
mountConfig的键值对结构(比如first:、second:),只需把遍历部分改成std.objectValues($.config.mountConfig):configMap: configMap.new('config') + configMap.withData( std.mergeObjects([cfg.data for cfg in std.objectValues($.config.mountConfig)]) ), deployment: std.foldl( (dep, cfg) => dep + k.util.configMapVolumeMount($.configMap, cfg.mountPath, cfg.subPath), deployment.new(...), std.objectValues($.config.mountConfig) ),
内容的提问来源于stack exchange,提问作者pagey101
相关产品推荐
相关产品推荐

