Bluemix Cloud Foundry:JAVA_OPTS $ PORT是空白的

时间:2016-07-22 18:30:28

标签: java ibm-cloud cloudfoundry

这是在IBM Bluemix中运行的。

我正在运行Java Ninja Framework应用程序,作为一个独立的jar(使用嵌入式Jetty)。如果我在本地运行它:

$ java -jar -Dninja.port=4444 new-app-1.0.0.jar

应用程序启动,并侦听端口4444:o.e.jetty.server.ServerConnector - Started ServerConnector@c9d0d6{HTTP/1.1}{0.0.0.0:4444}

但是,推送到CF时这不起作用。

我在清单中试过了:

---
applications:
- path: "./target/new-app-1.0.0.jar"
  memory: "500m"
  name: "foo-new-app"
  env:
    JAVA_OPTS: "-Dninja.port=$PORT"
  buildpack: java_buildpack

应用程序始终侦听8080(默认值):

OUT 03:25:29.979 [main] INFO o.e.jetty.server.ServerConnector - Started ServerConnector@65ae6ba4{HTTP/1.1}{0.0.0.0:8080}

因此,该应用程序无法通过健康检查,因为它正在侦听错误的端口。

根据@sabha的建议,我跑了

CF_TRACE=true cf app foo-new-app

这是检测到的启动命令:

  "detected_start_command":"CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.2_RELEASE -memorySizes=metaspace:64m.. -memoryWeights=heap:75,metaspace:10,native:10,stack:5 -memoryInitials=heap:100%,metaspace:100% -totMemory=$MEMORY_LIMIT) && JAVA_OPTS=\"-Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh $CALCULATED_MEMORY -Dninja.port=\" &&  eval exec $PWD/.java-buildpack/open_jdk_jre/bin/java $JAVA_OPTS -cp $PWD/. ninja.standalone.NinjaJetty"

看起来-Dninja.port arg未正确设置:

-Dninja.port=\"

如果我查看bluemix控制台(环境变量),这就是我对JAVA_OPTS变量的看法:

-Dninja.port=$PORT

Bluemix是否正确处理此问题?根据CF文档,我应该可以在那里使用$ PORT。

以下是java_buildpack文档使用$ PORT作为参数描述的地方:https://github.com/cloudfoundry/java-buildpack/blob/master/docs/framework-java_opts.md#escaping-strings

再次关注@sabha,我最终使用了:JAVA_OPTS="-Dninja.port=\\$PORT"

2 个答案:

答案 0 :(得分:1)

在CF Diego中,分配的默认端口为8080,因此您将获得默认行为。您可以通过以下方式验证: 1)cf ssh到app和ps -ef查看java命令行args或 2)重新启动应用程序并检查buildpack输出以获取释放步骤或 3)只需尝试CF_TRACE=true cf app foo-new-app并检查detected_start_command值。

答案 1 :(得分:1)

出现$ PORT在实际执行之前由buildpack解释。像'\ $ PORT'一样转义$ PORT,java buildpack就像文字一样使用它,arg在最终运行时被解释。

设置方式:** cf set-env foo-new-app JAVA_OPTS'-Deninja.port = \ $ PORT'**&& cf restage foo-new-app。

然后使用上述方法进行检查。 vcap @ i7lpc06hav3:〜$ ps -ef | grep java vcap 14 1 69 14:30? 00:00:33 /home/vcap/app/.java-buildpack/oracle_jre/bin/java -.......... -Dninja.port = 8080 -Daccess.logging .enabled = false -Dhttp.port = 8080 -classpath /home/vcap/app/.java- ... org.apache.catalina.startup.Bootstrap start