如何在Nexus远程Helm Charts中用files.get配置ConfigMap?
核心问题在于:Helm的$.Files.Get只能读取当前Chart包内包含的文件。远程Chart从Nexus拉取后,你本地的文件并不在这个远程Chart包中,所以Files.Get无法找到对应文件,导致配置失效。以下是针对性解决方法:
方案一:将文件打包进远程Chart(若有权限维护Chart)
如果你可以修改Nexus上的Helm Chart包,直接把需要加入ConfigMap的文件放到Chart目录下(比如新建files/子目录存放所有文件),然后在values.yaml中配置ConfigMap的fileName为文件相对路径(如files/cert.pem),你的原有configmap.yaml就能正常工作,和本地Chart的逻辑完全一致。
方案二:用--set-file传递本地文件(无需修改远程Chart)
放弃依赖$.Files.Get读取Chart内文件,改为通过helm install/upgrade的--set-file参数直接将本地文件内容注入Values:
- 修改
configmap.yaml,直接读取Values中的文件内容:{{ if $.Values.ConfigMap }} apiVersion: v1 kind: ConfigMap metadata: name: {{ template "obj.fullname" . }} data: {{- range $.Values.ConfigMap }} {{ .fileName }}: |- {{ .content | indent 4 -}} {{ end }} {{ end }} --- - 安装/升级Chart时,用
--set-file逐个传递文件:helm install my-release nexus-repo/my-chart \ --set-file ConfigMap[0].fileName=config.yaml,ConfigMap[0].content=./local/config.yaml \ --set-file ConfigMap[1].fileName=cert.pem,ConfigMap[1].content=./local/cert.pem注意:二进制文件不适合放在ConfigMap中,建议用Secret存储,同样可以用
--set-file传递,Helm会自动处理二进制内容的base64编码。
方案三:本地Subchart批量管理文件(适合多文件场景)
如果需要批量引入多个本地文件,可以创建一个本地小Chart,把所有文件放在该Chart的files/目录下,然后在远程主Chart的Chart.yaml中添加这个本地Chart作为Subchart,之后在configmap.yaml中引用Subchart的文件:
{{ if $.Values.ConfigMap }} apiVersion: v1 kind: ConfigMap metadata: name: {{ template "obj.fullname" . }} data: {{- range $.Values.ConfigMap }} {{ .fileName }}: |- {{ .Subcharts.local_files.Files.Get .fileName | indent 4 -}} {{ end }} {{ end }} ---
这种方式适合长期复用一批本地配置文件的场景。
二进制文件特殊处理
如果必须用ConfigMap存储二进制文件,需要使用binaryData字段(而非data),修改配置如下:
{{ if $.Values.ConfigMapBinary }} apiVersion: v1 kind: ConfigMap metadata: name: {{ template "obj.fullname" . }} binaryData: {{- range $.Values.ConfigMapBinary }} {{ .fileName }}: {{ .content }} {{ end }} {{ end }}
传递文件时同样用--set-file,Helm会自动完成base64编码:
helm install my-release nexus-repo/my-chart \ --set-file ConfigMapBinary[0].fileName=binary.bin,ConfigMapBinary[0].content=./local/binary.bin
内容的提问来源于stack exchange,提问作者vovagib

