Tomcat OpenShift迁移-Conf文件中的ENV变量没有像以前一样被替换

Tomcat OpenShift迁移-Conf文件中的ENV变量没有像以前一样被替换,tomcat,configuration,openshift,Tomcat,Configuration,Openshift,我正在将一个webapp从OpenShift v2迁移到OpenShift Pro。这是一个普通的JavaTomcat应用程序 OpenShift v2上的我的webapp在server.xml中指定了一个额外的docBase,如下所示: <Context docBase="${OPENSHIFT_DATA_DIR}/documents" path="/documents" /> <Context docBase="/opt/app-root/data/doc

我正在将一个webapp从OpenShift v2迁移到OpenShift Pro。这是一个普通的JavaTomcat应用程序

OpenShift v2上的我的webapp在server.xml中指定了一个额外的docBase,如下所示:

        <Context docBase="${OPENSHIFT_DATA_DIR}/documents" path="/documents" />
<Context docBase="/opt/app-root/data/documents" path="/documents" />
为了克服这个问题,我只需在server.xml中硬编码/opt/app root/data,如下所示:

        <Context docBase="${OPENSHIFT_DATA_DIR}/documents" path="/documents" />
<Context docBase="/opt/app-root/data/documents" path="/documents" />

下一次部署成功了

我的问题是:

这是部署过程中的错误吗?

这是将环境变量注入配置文件的错误方法吗?

如果是,正确的方法是什么?


任何帮助都将不胜感激,我不喜欢硬编码的东西,它总是在将来的某个日期回来咬你…

V2中设置的特殊环境变量都没有在V3中设置。关于V3,也没有安装持久卷的标准位置,安装位置取决于您。变量未显示为展开可能只是由于文件的任何处理,如果不存在这样的环境变量,则将其保留为变量引用。这假定替换仍然发生在V3下,并且V2没有什么特别之处


如果要保留环境变量以防覆盖它们,或者只是为了避免更改需要它们的代码,可以在部署配置中设置环境变量,或者可以在源代码repo中添加
.s2i/environment
文件,并在其中添加环境设置。
.s2i/environment
文件中的文件在构建时实际上成为应用程序映像的一部分。如果需要,它们可以稍后由部署配置中的环境变量覆盖

V2中设置的特殊环境变量均未在V3中设置。关于V3,也没有安装持久卷的标准位置,安装位置取决于您。变量未显示为展开可能只是由于文件的任何处理,如果不存在这样的环境变量,则将其保留为变量引用。这假定替换仍然发生在V3下,并且V2没有什么特别之处


如果要保留环境变量以防覆盖它们,或者只是为了避免更改需要它们的代码,可以在部署配置中设置环境变量,或者可以在源代码repo中添加
.s2i/environment
文件,并在其中添加环境设置。
.s2i/environment
文件中的文件在构建时实际上成为应用程序映像的一部分。如果需要,它们可以稍后由部署配置中的环境变量覆盖

如果您希望设置任何环境变量,请检查并

基本上,您应该在代码库中引入
.s2i/bin
文件夹,它可以覆盖多组脚本并引入任何自定义代码。这与V2中的动作挂钩类似

在这里,您可能希望在实际运行之前引入
设置环境变量
。e、 g

.s2i/bin/run script

#!/bin/bash
echo "Set environment variable before running application"
exec /usr/libexec/s2i/run
有几件事需要注意:

  • 通过引入脚本,它将被完全覆盖。若您希望在代码之后调用标准运行脚本,则必须调用该脚本。e、 g.
    /usr/libexec/s2i/run
    在最后一行

  • 默认运行脚本调用应该是最后一行。请不要期望控件返回来执行此后写入的任何内容


如果您希望设置任何环境变量,请检查并

基本上,您应该在代码库中引入
.s2i/bin
文件夹,它可以覆盖多组脚本并引入任何自定义代码。这与V2中的动作挂钩类似

在这里,您可能希望在实际运行之前引入
设置环境变量
。e、 g

.s2i/bin/run script

#!/bin/bash
echo "Set environment variable before running application"
exec /usr/libexec/s2i/run
有几件事需要注意:

  • 通过引入脚本,它将被完全覆盖。若您希望在代码之后调用标准运行脚本,则必须调用该脚本。e、 g.
    /usr/libexec/s2i/run
    在最后一行

  • 默认运行脚本调用应该是最后一行。请不要期望控件返回来执行此后写入的任何内容


谢谢Graham,但问题不在于环境变量,而在于它们的替换${OPENSHIFT_DATA_DIR}没有被正确替换,它被替换为:'/deployments/${OPENSHIFT_DATA_DIR}'注意原始文本前面的'/deployments/'。我刚刚在我的系统上看到一个log4j.xml文件,其中指定了一个如下的环境变量:${env:OPENSHIFT_DATA_DIR},所以我稍后会尝试一下……现在我可以确认,${env:OPENSHIFT_DATA_DIR}也没有被替换。我从日志中了解到:指定的主资源集[/deployments/${env:OPENSHIFT\u DATA\u DIR}/temp]无效。谢谢Graham,但问题不在于环境变量,而在于它们的替换${OPENSHIFT_DATA_DIR}没有被正确替换,它被替换为:'/deployments/${OPENSHIFT_DATA_DIR}'注意原始文本前面的'/deployments/'。我刚刚在我的系统上看到一个log4j.xml文件,其中指定了一个如下的环境变量:${env:OPENSHIFT_DATA_DIR},所以我稍后会尝试一下……现在我可以确认,${env:OPENSHIFT_DATA_DIR}也没有被替换。我在日志中看到:指定的主资源集[/deployments/${env:OPENSHIFT\u DATA\u DIR}/temp]无效。请注意。这个问题与设置环境变量无关。这是因为server.xml中的${OPENSHIFT_DATA_DIR}并没有被它的值替换,而这个值恰好是:/opt/app root/data@Lyndon这是因为,根本不存在这样的变量(我只是检查m)