我们如何在不使用 catalina.properties 的情况下将属性传递给 tomcat 上下文,或者是否有更好的方法来注入属性?
How do we pass properties to the tomcat context without using catalina.properties or is there a better way to inject the properties?
我们正在尝试使用 tomcat 图像将我们的项目移动到 docker,但对如何注入属性有点困惑。
我们的数据库配置权限现在如下所示:
/opt/tomcat/conf/context.xml
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<ResourceLink name="DBCON"
global="jdbc/DBCON"
auth="Container"
type="javax.sql.DataSource"/>
<Resource name="jdbc/DBCON"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="${oracle.database.url}"
username="${oracle.database.username}"
password="${oracle.database.password}"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
</Context>
/opt/tomcat/conf/catalina.属性
some other properties ...
...
...
oracle.database.url=jdbc:oracle:thin:@dev-database.com:1521:dev1
oracle.database.username=user
oracle.database.password=pass
我们希望使用映射到服务器 /some/loc/secrets/oracle.database.properties
上某个位置的秘密,但不知道如何将它们注入 context.xml,我们不想追加或编辑 cataline.properties 文件。我们计划在未来转移到 spring-boot,但对于一些项目来说,工作量相当大。
我找到了 <Envrionment>
和 <PreResources>
的示例,但不知道我们如何告诉 context.xml 实际使用这些属性。
将您的数据库属性设置为系统变量:
export JAVA_OPTS=$JAVA_OPTS -Doracle.database.username=user -Doracle.database.password=pass
正如其他人已经提到的,context.xml
文件中的变量必须作为系统属性提供。来自 Tomcat 配置参考:
Tomcat configuration files are formatted as schemaless XML; elements
and attributes are case-sensitive. Apache Ant-style variable
substitution is supported; a system property with the name propname
may be used in a configuration file using the syntax ${propname}. All
system properties are available including those set using the -D
syntax, those automatically made available by the JVM and those
configured in the $CATALINA_BASE/conf/catalina.properties file
如果您想要将这些秘密值放在不同的文件中,您可以覆盖 Tomcat docker 容器的 CMD。例如,这可能是一个 shell 脚本,它从文件中读取变量,将它们导出为 @Octavian 的答案,然后才启动服务器。
我们正在尝试使用 tomcat 图像将我们的项目移动到 docker,但对如何注入属性有点困惑。
我们的数据库配置权限现在如下所示:
/opt/tomcat/conf/context.xml
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<ResourceLink name="DBCON"
global="jdbc/DBCON"
auth="Container"
type="javax.sql.DataSource"/>
<Resource name="jdbc/DBCON"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="${oracle.database.url}"
username="${oracle.database.username}"
password="${oracle.database.password}"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
</Context>
/opt/tomcat/conf/catalina.属性
some other properties ...
...
...
oracle.database.url=jdbc:oracle:thin:@dev-database.com:1521:dev1
oracle.database.username=user
oracle.database.password=pass
我们希望使用映射到服务器 /some/loc/secrets/oracle.database.properties
上某个位置的秘密,但不知道如何将它们注入 context.xml,我们不想追加或编辑 cataline.properties 文件。我们计划在未来转移到 spring-boot,但对于一些项目来说,工作量相当大。
我找到了 <Envrionment>
和 <PreResources>
的示例,但不知道我们如何告诉 context.xml 实际使用这些属性。
将您的数据库属性设置为系统变量:
export JAVA_OPTS=$JAVA_OPTS -Doracle.database.username=user -Doracle.database.password=pass
正如其他人已经提到的,context.xml
文件中的变量必须作为系统属性提供。来自 Tomcat 配置参考:
Tomcat configuration files are formatted as schemaless XML; elements and attributes are case-sensitive. Apache Ant-style variable substitution is supported; a system property with the name propname may be used in a configuration file using the syntax ${propname}. All system properties are available including those set using the -D syntax, those automatically made available by the JVM and those configured in the $CATALINA_BASE/conf/catalina.properties file
如果您想要将这些秘密值放在不同的文件中,您可以覆盖 Tomcat docker 容器的 CMD。例如,这可能是一个 shell 脚本,它从文件中读取变量,将它们导出为 @Octavian 的答案,然后才启动服务器。