我正在尝试在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中定义,它们在构建期间打包在映像中。
答案 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.xml
以env.
格式引用。
更新:
从@Lata尝试如下:
我用大写字母和小写字母尝试了这种情况。我得到的是,在server.xml中使用哪种大小写都没有关系。但是,在调用docker run时,您只需要在CAPS中传递变量即可工作。
因此,最终结论应该是:无论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.password
,db.username
和bootstrap.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