如何在运行时将数据源密码传递给 websphere liberty 容器

How to pass datasource password to websphere liberty container during runtime

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

在 server.xml 中,我定义了具有连接字符串、用户名和密码等所有配置属性的数据源。我已经使用这个文件构建了图像。现在,我想通过将值作为 env 变量传递而不是在 server.xml 中进行硬编码来在不同的环境中测试相同的图像。 我找不到 server.xml 可以直接读取环境变量并替换密码变量的方法。 我尝试的其他方法是使用 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 中定义,在构建时打包在映像中。

来自this

The following predefined variables can be referenced:
* directory properties, see Liberty: Directory locations and properties
* JVM system properties
* process environment variables

If the same variable is specified in multiple places, the precedence is as follows:
* variables in bootstrap.properties override the process environment variables
* variables in server.xml, or included XML files, override the variables in bootstrap.properties and process environment variables

Use process environment variables in the configuration. Process environment variables are available if you use the env. configuration variable prefix, for example:

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

For more information on specifying environment variables, see Customizing the Liberty environment.

那么,一个可能的解决方案是:

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 的尝试:

I tried the scenario with capital and small letters. What I got is it doesn't matter which casing you use in server.xml. But while calling the docker run, you have to pass the variables in CAPS only to work.

  • server.xml - 大写字母
    • docker 运行 - 大写字母 - 作品
    • docker 运行- 小写字母 - 不起作用。
  • server.xml - 小写字母
    • docker 运行 -CAPS 字母 - 有效。
    • docker 运行 - 小写字母 - 不起作用。

所以,最后的结论应该是:server.xml不管CAPS还是LOW case letter,但是需要把CAPS env传给docker run。由于 docker 没有这样的限制,所以肯定 websphere 强制执行此限制。

虽然@atline 的响应对于旧版本的 Liberty 是正确的,因为问题是 运行 在 Docker 容器中,但它们很可能 运行 在 19.0 之后的 Liberty 版本上.0.3 在可变分辨率方面具有不同的行为。

从19.0.0.3开始环境变量解析不再需要env。前缀并且不需要变量名是大写的。如本link

所述

Environment variables can be accessed as variables. From 19.0.0.3, they can be accessed directly by referencing the environment variable name. If the variable cannot be resolved the following transformations on the environment variable name is tried:

  • Replace all non-alpha num characters with _
  • Change all characters to upper case.

If you enter ${my.env.var} in server.xml it will look for environment variables with the following names:

  • my.env.var
  • my_env_var
  • MY_ENV_VAR

When using a Liberty release older than 19.0.0.3, environment variables can be accessed by adding env. to the start of the environment variable name:

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

根据问题,似乎在 bootstrap.properties 以及环境变量中指定了值,并且 bootstrap.properties 覆盖了环境变量:

You can parameterize server config using variables. When resolving variable names the following sources are consulted in increasing order of precedence:

  • server.xml default variable values
  • environment variables
  • bootstrap.properties
  • Java system properties
  • server.xml config

要从 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>

如果您从 bootstrap.properties 中删除 db.urldb.passworddb.username 的定义,那么您可以这样启动一个 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