我们如何在不使用 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 的答案,然后才启动服务器。