You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中Quartz配置文件无法读取环境变量问题

Kubernetes中Quartz配置文件无法读取环境变量的问题

我有一个部署在Kubernetes中的Spring Boot应用,集成了Quartz调度组件。为满足多环境部署需求,已将quartz.properties存入ConfigMap实现环境隔离。

目前计划将所有密码存储到环境变量中,这种方式在Spring的application.properties中可以正常生效,但在quartz.properties里无法实现变量替换。

我参考方案使用以下格式:

org.quartz.dataSource.quartzDS.user=$@MY_ENV_VARIABLE
org.quartz.dataSource.quartzDS.password=$@MY_OTHER_ENV_VARIABLE

该配置在本地Windows环境正常工作,但部署到Kubernetes(基于Ubuntu镜像)后,变量被当作字面量$@MY_ENV_VARIABLE处理。目前仅能考虑在部署流水线中通过文本替换注入明文密码,但希望实现与本地一致的效果。

补充说明:已尝试以下格式,服务器端均无效:

${MY_ENV_VARIABLE}
$@MY_ENV_VARIABLE (本地PC有效)
$\@MY_ENV_VARIABLE
"$@MY_ENV_VARIABLE"

补充配置:
configmap.yml:

kind: ConfigMap
apiVersion: v1
metadata:
  name: my-configmap
data:
  application.properties: |-
    {{- .Files.Get "config-maps/application.properties" | nindent 8 }}

  myapp.properties: |-
    {{- .Files.Get "config-maps/myapp.properties" | nindent 8 }}

  logback-spring.xml: |-
    {{- .Files.Get "config-maps/logback-spring.xml" | nindent 8 }}

  quartz.properties: |-
    {{- .Files.Get "config-maps/quartz.properties" | nindent 8 -}}

deployment.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.ANS_msname }}
  namespace: {{ .Values.ANS_NAMESPACE }}
  labels:
    app: {{ .Chart.Name }}
    version: {{ .Chart.Version }}

spec:
  replicas: {{ .Values.my_ms_replicas }}
  strategy:
    type: {{ .Values.k8s_deployment_strategy }}
    rollingUpdate:
      maxUnavailable: {{ .Values.pod_maxUnavailable }}
      maxSurge: {{ .Values.pod_maxSurge }}
  minReadySeconds: {{ .Values.pod_minReadySeconds }}
  revisionHistoryLimit: {{ .Values.pod_revisionHistoryLimit }}
  selector:
    matchLabels:
      app: {{ .Chart.Name }}

  template:
    metadata:
      name: pod-env-var 
      labels:
        app: {{ .Chart.Name }}
        version: {{ .Chart.Version }}

    spec:
      containers:
        - name: {{ .Values.ANS_msname }}
          image: {{ .Values.ANS_imagename }}
          volumeMounts:
            - mountPath: "/home/my/configmap/"
              readOnly: true
              name: my-conf
            - mountPath: "/home/my/fileshare"
              name: aksfs
            - mountPath: "/tmp"
              name: temp-volume
          imagePullPolicy: {{ .Values.k8s_imagepullpolicy }}
          securityContext:
            readOnlyRootFilesystem: true
          envFrom:
            - configMapRef:
                name: my-configmap
          resources:
            requests:
              memory: {{ .Values.my_ms_reources_requests_memory }}
              cpu: {{ .Values.my_ms_reources_requests_cpu }}
            limits:
              memory: {{ .Values.my_ms_reources_limits_memory }}
              cpu: {{ .Values.my_ms_reources_limits_cpu }}
          ports:
          - name: https
            containerPort: {{ .Values.SERVER_PORT }}
            protocol: TCP
          env:
          - name: JAVA_OPTS
            value: "{{ .Values.JVM_ARGS }}"
          - name: NAMESPACE
            value: "{{ .Values.ANS_NAMESPACE }}"
          - name: APP_NAME
            value: "{{ .Values.ANS_msname }}"
          - name: APP_VERSION
            value: "{{ .Chart.Version }}"
          - name: APP_ENV
            value: "{{ .Values.TARGET_ENV }}"
          - name: k8sClusterUrl
            value: "{{ .Values.k8server }}"
          - name: IMAGE_NAME
            value: "{{ .Values.ANS_imagename }}"
          - name: NON_HTTPPROXY_HOSTS
            value: "{{ .Values.NON_HTTPPROXY_HOSTS }}"
          - name: NON_HTTPSPROXY_HOSTS
            value: "{{ .Values.NON_HTTPSPROXY_HOSTS }}"
          - name: HTTP_PROXY_HOST
            value: "{{ .Values.HTTP_PROXY_HOST }}"
          - name: HTTPS_PROXY_HOST
            value: "{{ .Values.HTTPS_PROXY_HOST }}"
          - name: HTTPS_PROXY_PORT
            value: "{{ .Values.HTTPS_PROXY_PORT }}"
          - name: HTTP_PROXY_PORT
            value: "{{ .Values.HTTP_PROXY_PORT }}"
          - name: HTTP_PROXY_FLAG
            value: "{{ .Values.HTTP_PROXY_FLAG }}"
          - name: spring.profile
            value: "dev"
          - name: SERVICE_PROPERTIES_LOCATION
            value: "{{ .Values.SERVICE_PROPERTIES_LOCATION }}"
          - name: myapp_PROPERTIES_LOCATION
            value: "{{ .Values.myapp_PROPERTIES_LOCATION }}"
          - name: SECURITY_FILTER_YAML_LOCATION
            value: "{{ .Values.SECURITY_FILTER_YAML_LOCATION }}"

          livenessProbe:
            httpGet:
              path: /actuator/health
              port: {{ .Values.server_health_port }}
              scheme: HTTPS
              httpHeaders:
                - name: X-Custom-Header
                  value: Alive
            initialDelaySeconds: {{ .Values.k8s_liveness_initialDelaySeconds }}
            timeoutSeconds: {{ .Values.k8s_liveness_timeoutSeconds }}
            periodSeconds: {{ .Values.k8s_liveness_periodSeconds }}
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: {{ .Values.k8s_readinessProbe_port }}
              scheme: HTTPS
              httpHeaders:
                - name: X-Custom-Header
                  value: Ready
            initialDelaySeconds: {{ .Values.k8s_readiness_initialDelaySeconds }}
            timeoutSeconds: {{ .Values.k8s_readiness_timeoutSeconds }}
            periodSeconds: {{ .Values.k8s_readiness_periodSeconds }} 

      restartPolicy: Always
      securityContext:
        runAsUser: 100
        runAsNonRoot: true
      volumes:
        - name: my-conf
          configMap:
            name: my-configmap
            items:
              - key: application.properties
                path: application.properties
              - key: myapp.properties
                path: myapp.properties
              - key: quartz.properties
                path: quartz.properties
              - key: logback-spring.xml
                path: logback-spring.xml
        - name: aksfs
          persistentVolumeClaim:
            claimName: {{ .Values.persistence_volume_claim_name }}
        - name: temp-volume
          emptyDir: {}

内容的提问来源于stack exchange,提问作者jase52476

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:30:54