在 tomcat catalina.properties 中注入环境变量 [Kubernetes]

Gee*_*ior 5 tomcat catalina kubernetes kubernetes-secrets

我正在使用 kubernetes 进行 Web 应用程序部署。

  containers:
  - name: myapp
    image: tomcat8-jre8:latest
    imagePullPolicy: Always
    env:     
    - name: DATABASE_HOST
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: external.database.host
    - name: DATABASE_USER
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: external.database.user
    - name: DATABASE_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: external.database.password
Run Code Online (Sandbox Code Playgroud)

我还将 tomcat JNDI 与自定义 server.xml 和 catalina.properties 一起使用

 <Resource factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            name="jdbc/mysource" 
            auth="Container" 
            type="javax.sql.DataSource" 
            driverClassName="org.postgresql.Driver" 
            url="jdbc:postgresql://******" # secret url
            username="${database.user}"      
            password="${database.password}" />
Run Code Online (Sandbox Code Playgroud)

我尝试将新属性放入 catalina.properties

### catalina specific configuration
database.user = ${DATABASE_USER}              
database.password = ${DATABASE_PASSWORD}   
Run Code Online (Sandbox Code Playgroud)

server.xml 可以很好地读取属性,但无法解析环境变量 ${DATABASE_USER} 和 ${DATABASE_PASSWORD}

server.xml 和 catalina.properties 都作为配置映射安装,敏感信息保存在环境变量中。我们不知道他们的价值观

环境变量是在我登录 pod 时设置的,并且可以从我的 web 应用程序(基于 java)中识别,但无法从 catalina.properties(和/或 server.xml)中读取它

谁能给我一点建议吗?是否可以在 tomcat 配置中注入环境变量?

谢谢

Vis*_*hal 9

我遇到了同样的问题, @jamesfry的答案帮助我解决了这个问题。虽然我很难找到如何在 Kubernetes 中为容器设置“系统属性”。因此,根据詹姆斯的回答,在“部署”中共享修复所需的确切代码更改:

containers:
  - name: myapp
    image: tomcat8-jre8:latest
    imagePullPolicy: Always
    env:     
    - name: JAVA_OPTS
      value: -Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource
    - name: DATABASE_HOST
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: external.database.host
    - name: DATABASE_USER
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: external.database.user
    - name: DATABASE_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: external.database.password
Run Code Online (Sandbox Code Playgroud)

请注意,您的 JNDI 可以直接使用部署文件中的环境变量,如下所示:

<Resource factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            name="jdbc/mysource" 
            auth="Container" 
            type="javax.sql.DataSource" 
            driverClassName="org.postgresql.Driver" 
            url="jdbc:postgresql://${DATABASE_HOST}" # secret url
            username="${DATABASE_USER}"      
            password="${DATABASE_PASSWORD}" />
Run Code Online (Sandbox Code Playgroud)

而且你不需要碰catalina.properties。


Jam*_*Fry 5

请参阅https://tomcat.apache.org/tomcat-9.0-doc/config/systemprops.html

太长了;将系统属性设置org.apache.tomcat.util.digester.PROPERTY_SOURCEorg.apache.tomcat.util.digester.EnvironmentPropertySource,环境将用于系统属性之上的变量插值。

另一种方法是从 中的环境变量设置系统属性setenv.sh,不幸的是,在启动时将属性转储到控制台(将它们声明为“命令行参数”),从而泄漏以这种方式共享的任何秘密。

  • 谢谢这有帮助。问题:您提到:环境将用于变量插值“而不是”系统属性。环境属性会像系统属性“之上”一样使用吗?您提供的文档链接并未说明不会使用系统属性。 (2认同)
  • @Vishal它应该是“在之上”而不是“而不是”。[EnvironmentPropertySource](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/tomcat/util/digester/EnvironmentPropertySource.html) JavaDoc 说“**注意**:配置 PropertySource 时从系统属性解析表达式仍然处于活动状态。” (2认同)