Openshift 4.19 (Kubernetes 1.19) Tomcat spring 应用程序使用配置映射条目覆盖部署的文件清除完整的部署目录

Openshift 4.19 (Kubernetes 1.19) Tomcat spring app overwrite deployed file with config map entry clears complete deployment directory

我在带有 Openshift 4.19(使用 Kubernetes 1.19)的 POD 内的 Tomcat 服务器下部署了一个 Spring 启动应用程序。我的目标是将 logback 配置外部化到 configmap,这样我就可以在生产中根据需要更改日志级别,而无需重新启动 pods.

我使用了以下配置:

ConfigMap

    kind: ConfigMap
apiVersion: v1
metadata:
  name: logback-configmap
[..]
data:
  logback: |
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds">
[...]

部署配置

[...]
spec:
      volumes:
        - name: logback-configmap-volume
          configMap:
            name: logback-configmap
            items:
              - key: logback
                path: logback.xml
            defaultMode: 420
[..]
         volumeMounts:
            - name: logback-configmap-volume
              mountPath: /deployments/zfaRouter/WEB-INF/classes/logback.xml
              subPath: logback.xml
[..]

问题是,上面的配置清除了/deployments/zfaRouter/WEB-INF/classes/:

下的完整目录结构
sh-4.4$ ls -la /deployments/zfaRouter/WEB-INF/classes/
total 4
drwxr-xr-x. 2 root root         25 May  4 16:35 .
drwxr-xr-x. 3 root root         21 May  4 16:35 ..
-rw-r--r--. 1 root 1015170000 1084 May  4 16:35 logback.xml

我尝试了所有可能的组合(例如,没有 subPath 元素,没有 mountPath 中的文件名,没有 volumes 部分中的 items 元素)没有任何运气。从这里和官方 Kubernetes 文档中读到的,它应该像上面的配置一样工作。

关于这个问题有什么想法吗?

用作挂载点的目录覆盖了所有其他内容,因此看起来像是覆盖了您期望的内容。即使您想 'just' 挂载单个文件,也必须存在挂载点。

对于您的特定场景,您可以挂载到不同的目录,例如 /config 并将其添加到类路径,或者您可以使用子目录,例如 /deployments/zfaRouter/WEB-INF/classes/config 并将其添加到类路径。

如果您不想更改类路径,您可以将配置文件挂载到 f.e。 /config 并更改您的应用程序启动脚本以将其复制到合适的位置,例如复制到 tomcat 类加载器选取的 tomcat 共享库文件夹。