我们如何在不使用catalina.properties的情况下将属性传递给tomcat上下文,或者有没有更好的方法来注入属性?

时间:2018-06-22 21:40:19

标签: java spring docker tomcat secret-key

我们正在尝试使用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.properties

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中,并且我们不想添加或编辑目录.properties文件。我们计划在将来进行春季启动,但是对于一些项目来说,这项工作非常艰巨。

我已经找到了<Envrionment><PreResources>的示例,但是看不到如何告诉context.xml实际使用这些属性。

2 个答案:

答案 0 :(得分:1)

将数据库属性设置为系统变量:

export JAVA_OPTS=$JAVA_OPTS -Doracle.database.username=user -Doracle.database.password=pass

答案 1 :(得分:1)

正如其他人所述,context.xml文件中的变量必须可用作系统属性。从《 Tomcat配置参考》:

  

Tomcat配置文件的格式设置为无模式XML。元素   并且属性区分大小写。 Apache Ant样式的变量   支持替代;名称为propname的系统属性   可以在配置文件中使用$ {propname}语法使用。所有   系统属性可用,包括使用-D设置的属性   语法,JVM自动提供的语法以及   在$ CATALINA_BASE / conf / catalina.properties文件中配置

如果要将这些秘密值保存在其他文件中,则可以覆盖Tomcat docker容器的CMD。例如,这可能是一个shell脚本,该脚本从文件中读取变量,并按照@Octavian的回答将其导出,然后才启动服务器。