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

时间:2020-03-09 16:16:08

标签: tomcat kubernetes catalina 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

我还使用带有自定义server.xml和catalina.properties的tomcat 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://******" # secret url
            username="${database.user}"      
            password="${database.password}" />

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

### catalina specific configuration
database.user = ${DATABASE_USER}              
database.password = ${DATABASE_PASSWORD}   

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

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

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

有人可以给我小费吗?是否可以在tomcat配置中注入环境变量?

谢谢

2 个答案:

答案 0 :(得分:3)

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

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

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

<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}" />

而且您不需要触摸 catalina.properties。

答案 1 :(得分:1)

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

TLDR;将系统属性org.apache.tomcat.util.digester.PROPERTY_SOURCE设置为org.apache.tomcat.util.digester.EnvironmentPropertySource,环境将用于变量插值而不是系统属性。

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