如何在运行时将数据源密码传递到Websphere自由容器

时间:2019-07-03 04:05:47

标签: docker passwords datasource websphere-liberty server.xml

我正在尝试在Websphere自由配置文件容器中运行我的应用程序。我想有1个可以在diff env(dev,st,sit等)上运行的图像。我可以使用env变量在运行时将值传递给容器。如何在wlp设置中使用它们?这可能吗?

在server.xml中,我已使用所有配置属性(如连接字符串,用户名和密码)定义了数据源。我已经使用此文件构建了图像。现在,我想通过将值作为env变量而不是在server.xml中进行硬编码来在不同的env中测试同一图像。 我找不到server.xml可以直接读取env var并替换password变量的方法。 我尝试过的其他方法是使用bootstrap.properties,以便server.xml可以从该文件读取值。但是在这里,我还必须在图像构建过程中提供bootstrap.properties,并且在运行时不能更改值。

server.xml中的行:

<dataSource name="XYZ" jndiName="jdbc/xyz" transactional="false"> <jdbcDriver id="OracleJdbcDriver" libraryRef="xyzLib"/> <properties.oracle URL="${db.url}" user="${db.username}" password="${db.password}"/> </dataSource>

db.url,db.username和db.password在bootstrap.properties中定义,它们在构建期间打包在映像中。

2 个答案:

答案 0 :(得分:2)

来自this

  

可以引用以下预定义变量:
  *目录属性,请参阅Liberty:目录位置和属性
  * JVM系统属性
  *流程环境变量

     

如果在多个位置指定了相同的变量,则优先级如下:
  * bootstrap.properties中的变量会覆盖过程环境变量
  * server.xml或包含的XML文件中的变量会覆盖bootstrap.properties中的变量并处理环境变量

     

在配置中使用过程环境变量。   如果使用环境,则可以使用过程环境变量。配置变量前缀,例如:

<fileset dir="${env.LIBRARY_DIR}" includes="*.jar"/>
     

有关指定环境变量的更多信息,请参阅定制Liberty环境。

然后,可能的解决方案是:

server.xml:

<properties.oracle URL="${env.db_url}" user="${env.db_username}" password="${env.db_password}"/>

在运行环境时将环境传递给容器:

docker run -d -e db_url=xxx -e db_username=xx -e db_password=x your_image

然后,将不同的值传递到不同的容器,并最终由server.xmlenv.格式引用。

更新:

从@Lata尝试如下:

  

我用大写字母和小写字母尝试了这种情况。我得到的是,在server.xml中使用哪种大小写都没有关系。但是,在调用docker run时,您只需要在CAPS中传递变量即可工作。

  • server.xml-CAPS字母
    • docker run-CAPS字母-有效
    • docker run-小写字母-不起作用。
  • server.xml-小写字母
    • docker run -CAPS letter-可以。
    • docker run-小写字母-不起作用。

因此,最终结论应该是:无论server.xml中的CAPS还是LOW字母都大,但是需要将CAPS env传递给docker run。由于码头工人没有这样的限制,所以绝对websphere强制执行此限制。

答案 1 :(得分:2)

尽管@atline的响应对于Liberty的较早版本是正确的,因为该问题在Docker容器中运行,但是它们很可能在19.0.0.3以后的Liberty版本上运行,该版本在变量分辨率方面具有不同的行为。

从19.0.0.3开始,环境变量解析不再需要env。前缀,不需要变量名大写。如link

中所述
  

环境变量可以作为变量访问。从19.0.0.3起,可以通过引用环境变量名称直接访问它们。如果无法解析变量,请尝试对环境变量名称进行以下转换:

     
      
  • 将所有非字母数字字符替换为_
  •   
  • 将所有字符更改为大写。
  •   
     

如果在server.xml中输入$ {my.env.var},它将查找具有以下名称的环境变量:

     
      
  • my.env.var
  •   
  • my_env_var
  •   
  • MY_ENV_VAR
  •   
     

使用早于19.0.0.3的Liberty发行版时,可以通过添加env来访问环境变量。到环境变量名称的开头:

     
<httpEndpoint id="defaultHttpEndpoint"
             host="${env.HOST}"
             httpPort="9080" />

基于该问题,似乎在bootstrap.properties以及环境变量中指定了该值,而bootstrap.properties覆盖了环境变量:

  

您可以使用变量来参数化服务器配置。解析变量名称时,将按优先级递增的顺序查询以下来源:

     
      
  • server.xml默认变量值
  •   
  • 环境变量
  •   
  • bootstrap.properties
  •   
  • Java系统属性
  •   
  • server.xml配置
  •   

要从docker中读取它们,您需要从bootstrap.properties中删除它们。给出您的示例:

<dataSource name="XYZ" jndiName="jdbc/xyz" transactional="false">
    <jdbcDriver id="OracleJdbcDriver" libraryRef="xyzLib"/>
    <properties.oracle URL="${db.url}" user="${db.username}" password="${db.password}"/>
</dataSource>

如果从db.url中删除db.passworddb.usernamebootstrap.properties的定义,则可以这样启动docker映像:

docker run -d -e db_url=xxx -e db_username=xx -e db_password=x your_image

如果要定义默认值(如果未指定默认值),则可以将其添加到server.xml

<variable name="db.url" defaultValue="jdbc:XXX"/>
<variable name="db.username" defaultValue="testUser"/>
<variable name="db.password" defaultValue="testPassword that will be encoded or encrypted"/>

如果您想对密码进行编码或加密,使其不是纯文本形式,则可以使用:

securityUtility encode --encoding=[xor|aes]

通过运行以下命令可获得所有选项的完整帮助:

securityUtility help encode