Bluemix Cloud Foundry:JAVA_OPTS $PORT 为空
Bluemix Cloud Foundry: JAVA_OPTS $PORT is blank
这是在 IBM Bluemix 中 运行ning。
我正在 运行安装一个 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 I 运行
的建议
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"
在 CF Diego 中,分配的默认端口是 8080
,因此您会得到默认行为。您可以通过以下方式验证这一点:
1) cf ssh
应用程序和 ps -ef
查看 java 命令行参数或
2) 重新启动应用程序并检查发布步骤的 buildpack 输出或
3) 只需尝试 CF_TRACE=true cf app foo-new-app
并检查 detected_start_command 值。
$PORT 似乎在实际执行之前由 buildpack 提前解释。像这样 '\$PORT' 转义 $PORT 并且 java buildpack 只是像文字一样使用它并且 arg 在最终运行时得到解释。
这样设置:**cf set-env foo-new-app JAVA_OPTS ' -Dninja.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 开始
这是在 IBM Bluemix 中 运行ning。
我正在 运行安装一个 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 I 运行
的建议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"
在 CF Diego 中,分配的默认端口是 8080
,因此您会得到默认行为。您可以通过以下方式验证这一点:
1) cf ssh
应用程序和 ps -ef
查看 java 命令行参数或
2) 重新启动应用程序并检查发布步骤的 buildpack 输出或
3) 只需尝试 CF_TRACE=true cf app foo-new-app
并检查 detected_start_command 值。
$PORT 似乎在实际执行之前由 buildpack 提前解释。像这样 '\$PORT' 转义 $PORT 并且 java buildpack 只是像文字一样使用它并且 arg 在最终运行时得到解释。
这样设置:**cf set-env foo-new-app JAVA_OPTS ' -Dninja.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 开始