helm-读取配置文件到ConfigMap并映射到容器中

背景

有个 tomcat 镜像,开发想改 tomcat/conf/web.xml 文件进行问题调试,为了避免调试过程中反复打镜像,所以定了将 web.xml 文件作为 key-value 写入 ConfigMap 内,再将 key-value 读出映射到容器内的文件。

操作

chart 文件结构

.
|-- example
|  |-- Values.yaml
|  |-- Chart.yaml
|  |--  conf
|  |  |-- web.xml   # 这是 tomcat 的 web.xml 文件
|  |-- templates
|  |  |-- deployment.yaml
|  |  |-- configmap.yaml
|  |  |-- service.yaml

ConfigMap.yaml做如下配置,会在配置中生成一个 key=web.xml,value=<web.xml文件中内容> 的键值对配置。

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  data:
{{ (.Files.Glob "conf/web.xml").AsConfig | indent 2 }}
  port: 3001
  env: dev
  ..其他的配置键值对

Deployment.yaml做如下配置,主要是定义一个卷,此卷从 configMap 读取配置;再在容器中将此卷挂载,定义子路径

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ template "fullname" . }}
  labels:
    app: {{ template "name" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "name" . }}
        release: {{ .Release.Name }}
    spec:
      imagePullSecrets:
        - name: {{ .Values.image.secret }}
      volumes:
        - name: conf-volume
          configMap:
            name: config
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
        volumeMounts:
          - name: conf-volume
            mountPath: /usr/local/tomcat/conf/web.xml
            subPath: web.xml

存在问题

java 应用,configMap 中的 k-v 都是作为环境变量注入启动参数的,web.xml 文件内容非常大,有四千多行,在容器启动的时候,提示参数太长,jvm无法启动,最终还是走了重新打镜像的方案,,,因是调试下功能,所以没选择给挂载存储卷的方案。