在Kubernetes中通过ConfigMap挂载docx文件遇空值问题求助
解决ConfigMap中docx字段值为null的问题
问题根源
docx是二进制文件,Helm的Files.Get函数默认仅能正确读取UTF-8编码的文本文件,直接读取二进制文件会导致内容解析异常,最终生成null值。
解决方案
1. 对docx文件进行Base64编码
ConfigMap的data字段仅支持UTF-8文本内容,因此需要将二进制docx文件转为Base64编码格式:
base64 TEST_FILE.docx > TEST_FILE.docx.b64
将生成的TEST_FILE.docx.b64文件放入Helm chart的resources/files目录下。
2. 修改Helm模板读取编码后的文件
调整模板,读取Base64编码后的文件内容:
{{- range .Values.resourcesFrom.file}} --- apiVersion: v1 kind: ConfigMap metadata: name: file-{{ . | lower | replace "_" "-" }} labels: {{- include "labels.global" $ | indent 4 }} data: {{ . }}.b64: |- {{- $.Files.Get (printf "resources/files/%s.b64" .) | indent 4 }} {{- end }}
如果不想提前编码,也可以直接在模板中用Helm的b64enc函数对原文件编码:
{{- range .Values.resourcesFrom.file}} --- apiVersion: v1 kind: ConfigMap metadata: name: file-{{ . | lower | replace "_" "-" }} labels: {{- include "labels.global" $ | indent 4 }} data: {{ . }}.b64: |- {{- $.Files.Get (printf "resources/files/%s" .) | b64enc | indent 4 }} {{- end }}
3. 在Pod中解码还原文件
将ConfigMap挂载到Pod后,需要在容器启动时将Base64内容解码回原docx文件,示例Pod配置:
containers: - name: your-container image: your-image command: ["/bin/sh", "-c"] args: - base64 -d /mnt/config/TEST_FILE.docx.b64 > /mnt/app/TEST_FILE.docx && your-original-startup-command volumeMounts: - name: file-config mountPath: /mnt/config volumes: - name: file-config configMap: name: file-test-file.docx
额外检查项
- 确认
resources/files/TEST_FILE.docx(或编码后的.b64文件)确实存在于Helm chart目录中; - 检查
.helmignore文件,确保没有排除docx或b64后缀的文件,如果有则移除对应规则。
内容的提问来源于stack exchange,提问作者kcxsk
相关产品推荐
相关产品推荐

