在 tomcat catalina.properties [Kubernetes] 中注入环境变量
inject environment variables in tomcat catalina.properties [Kubernetes]
我正在使用 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
我还使用 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}" />
我尝试将新的 属性 放入 catalina.properties
### catalina specific configuration
database.user = ${DATABASE_USER}
database.password = ${DATABASE_PASSWORD}
server.xml 可以很好地读取 属性 但无法解析环境变量 ${DATABASE_USER} 和 ${DATABASE_PASSWORD}
server.xml 和 catalina.properties 都挂载为配置映射,敏感信息保存在环境变量中。我们不知道他们的价值观
环境变量是在我登录 pod 时设置的,并且可以从我的 webapp(基于 java)中识别,但无法从 catalina.properties(and/or server.xml)
任何人都可以给我一些建议吗?是否可以在 tomcat 配置中注入环境变量?
谢谢
见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
中的环境变量设置系统属性,不幸的是在启动时将属性转储到控制台(声明它们 'command line arguments'),从而泄露任何以这种方式共享的秘密。
我遇到了同样的问题, 的回答帮助我解决了这个问题。尽管我很难找到如何在 Kubernetes 中为容器设置“system 属性”。因此,根据 James 的回答,'Deployment' 中所需的确切代码更改共享修复程序:
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 可以直接在部署文件中使用您的环境变量,如下所示:
<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。
我正在使用 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
我还使用 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}" />
我尝试将新的 属性 放入 catalina.properties
### catalina specific configuration
database.user = ${DATABASE_USER}
database.password = ${DATABASE_PASSWORD}
server.xml 可以很好地读取 属性 但无法解析环境变量 ${DATABASE_USER} 和 ${DATABASE_PASSWORD}
server.xml 和 catalina.properties 都挂载为配置映射,敏感信息保存在环境变量中。我们不知道他们的价值观
环境变量是在我登录 pod 时设置的,并且可以从我的 webapp(基于 java)中识别,但无法从 catalina.properties(and/or server.xml)
任何人都可以给我一些建议吗?是否可以在 tomcat 配置中注入环境变量?
谢谢
见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
中的环境变量设置系统属性,不幸的是在启动时将属性转储到控制台(声明它们 'command line arguments'),从而泄露任何以这种方式共享的秘密。
我遇到了同样的问题,
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 可以直接在部署文件中使用您的环境变量,如下所示:
<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。