Это работает в IBM Bluemix.
Я использую приложение Java Ninja Framework, как автономную банку (в которой используется встроенный Jetty). Если я запускаю его локально:
$ java -jar -Dninja.port=4444 new-app-1.0.0.jar
приложение запускается, и прослушивает порт 4444: o.e.jetty.server.ServerConnector - Started [email protected]{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 [email protected]{HTTP/1.1}{0.0.0.0:8080}
И поэтому приложение не может Healthcheck, так как его прослушивает неправильный порт.
После предложения по @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
арга не установлен должным образом:
-Dninja.port=\"
Если я смотрю в bluemix консоли (Environment Variables), это то, что я вижу в переменной JAVA_OPTS
:
-Dninja.port=$PORT
ли Bluemix не обрабатывает это правильно? Я должен иметь возможность использовать $ PORT там, согласно документам CF.
Вот где java_buildpack документы описывают с помощью $ PORT в качестве аргумента: https://github.com/cloudfoundry/java-buildpack/blob/master/docs/framework-java_opts.md#escaping-strings
Снова следуя @sabha, я в конечном итоге с помощью: JAVA_OPTS="-Dninja.port=\\$PORT"
Пробовал ваши предложения и обновлял вопрос. Ум взглянуть? – mtyson
Появляется $ PORT, который интерпретируется buildpack раньше перед реальным исполнением. Выйдите из $ PORT, как это, и java buildpack просто использует его как литерал, и аргумент arg интерпретируется в окончательном режиме исполнения: – sabha