我正在将一个webapp从OpenShift v2迁移到OpenShift Pro。这是一个常规的Java Tomcat应用程序。
我在OpenShift v2上的webapp在server.xml中指定了一个额外的docBase,如下所示:
<Context docBase="${OPENSHIFT_DATA_DIR}/documents" path="/documents" />
在部署期间,环境变量 OPENSHIFT_DATA_DIR 已替换为其值: / opt / app-root / data
正如您所期望的那样。
我在OpenShift Pro中设置了相同的(虽然完全不同),但部署失败了。经过调查,我在日志中看到了这一点:
Caused by: java.lang.IllegalArgumentException: The main resource set specified [/deployments/${OPENSHIFT_DATA_DIR}/documents] is not valid
为了解决这个问题,我只是在server.xml中硬编码 / opt / app-root / data ,如下所示:
<Context docBase="/opt/app-root/data/documents" path="/documents" />
下一次部署有效。
我的问题是:
这是部署过程中的错误吗?
这是将环境变量注入配置文件的错误方法吗?
如果是,那么正确的方法是什么?
任何帮助都会受到赞赏,我不喜欢硬编码的东西,它总会在未来的某个日期回来咬你...
答案 0 :(得分:0)
V2中设置的特殊环境变量都没有在V3中设置。对于V3,也没有安装持久卷的标准位置,它取决于您安装它的位置。该变量未显示为展开可能仅仅是由于文件的任何处理,如果不存在这样的环境变量,则将其保留为变量引用。这假设替换仍然在V3下发生,并且对于V2来说并不是特别的。
如果要保留环境变量以防止覆盖它们,或者只是为了避免更改需要它们的代码,可以在部署配置中设置环境变量,或者添加.s2i/environment
在源代码仓库中输入文件,并在其中添加环境设置。 .s2i/environment
文件中的那些实际上在构建时成为应用程序映像的一部分。如果需要,以后可以在部署配置中覆盖环境变量。
答案 1 :(得分:0)
如果您要设置任何环境变量,请检查this和this (s2i script section)。
基本上,您应该将.s2i/bin
文件夹引入代码库,该代码库可以覆盖多组脚本并引入任何自定义代码。这类似于V2中的动作挂钩。
在这里,您可能希望在实际运行之前引入setting environment variable
。 e.g。
.s2i/bin/run script
#!/bin/bash
echo "Set environment variable before running application"
exec /usr/libexec/s2i/run
很少有事要注意:
通过引入您的脚本,它被完全覆盖。如果您希望在代码后调用标准运行脚本,则必须调用该脚本。例如最后一行/usr/libexec/s2i/run
。
默认运行脚本调用应该是最后一行。请不要指望控件回来执行之后写的任何内容。