如何用jq将Deployment中符合规则的configMapKeyRef转为secretKeyRef
解决Kubernetes Deployment配置转换的jq命令
直接上符合需求的jq命令:
.spec.template.spec.containers[].env[] |= ( if .name | test("SECRET|PASSWORD|KEY") then .valueFrom |= ( .secretKeyRef = { name: .configMapKeyRef.key | ascii_downcase, key: .configMapKeyRef.key } | del(.configMapKeyRef) ) else . end )
命令说明
- 遍历所有容器的环境变量条目,对每个条目做原地修改(
|=) - 用
test("SECRET|PASSWORD|KEY")匹配name字段包含指定关键词的条目;如果需要忽略大小写,改成test("SECRET|PASSWORD|KEY"; "i") - 匹配到的条目:
- 基于原
configMapKeyRef的key生成secretKeyRef,其中name设为该key的小写形式(用ascii_downcase转小写) - 删除原有的
configMapKeyRef字段
- 基于原
- 未匹配的环境变量保持原样
示例转换
假设原环境变量条目:
{ "name": "API_KEY", "valueFrom": { "configMapKeyRef": { "name": "api-config", "key": "API_KEY" } } }
处理后会变成:
{ "name": "API_KEY", "valueFrom": { "secretKeyRef": { "name": "api_key", "key": "API_KEY" } } }
如果你的需求中“对应key”指的是环境变量的name字段(而非configMapKeyRef的key),只需把secretKeyRef的name字段修改为.name | ascii_downcase即可。
内容的提问来源于stack exchange,提问作者Nathanaël Blanchet
相关产品推荐
相关产品推荐

