虽然@atline的回答对于旧版的Liberty是正确的,但由于问题在Docker容器中运行,它们很可能正在运行一个Liberty版本,该版本从19.0.0.3开始对变量解析有不同的行为。
自19.0.0.3以来,环境变量解析不再需要env前缀,也不需要将变量名大写。如此文档所述:链接
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覆盖环境变量:
您可以使用变量来参数化服务器配置。在解析变量名称时,按照优先级递增的顺序查阅以下来源:
- 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>
如果您从
bootstrap.properties
中删除
db.url
,
db.password
和
db.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
env.DB_URL
而不是env.db_url
,并且不要使用点号,例如db.password
,而是使用DB_PASSWORD
。 - Gas<properties.oracle URL="${env.DB_URL}" user="${env.DB_USERNAME}" password="${env.DB_PASSWORD}"/>
docker run -d -e DB_URL=urlvalue -e DB_USERNAME=unamevalue -e DB_PASSWORD='passvalue'
- Lata