Добавление Java/JRE/JVM в приложение Python Flask Cloud Foundry/IBM Cloud
Я использую приложение фляги Python в Cloud Foundry/IBM Cloud-среде. В своем приложении я пытаюсь подключиться к DB2 Warehouse on Cloud с помощью IBMDBPY-пакета. Для этого пакета требуется пакет под названием jaydebeapi. Чтобы jaydebeapi работал, я думаю, что мне нужно установить JRE/JVM на сервере. Я попытался добавить Server JRE для ОС на базе Linux, но это тоже не сработало. Моя ошибка, которую я получил до того, как пытался загрузить Sever JRE, была такой:
idadb = IdaDataBase(dsn=jdbc) #Establish a connection to our DB2-service
1/20/2018 12:05:45 PM ERR undefined File "/home/vcap/deps/0/python./lib/python2.7/site-packages/ibmdbpy/base.py", line 282, in __init__
1/20/2018 12:05:45 PM ERR undefined jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.class.path=%s' % jarpath)
1/20/2018 12:05:45 PM ERR undefined File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_core.py", line 114, in get_default_jvm_path
1/20/2018 12:05:45 PM ERR undefined return finder.get_jvm_path()
1/20/2018 12:05:45 PM ERR undefined File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_jvmfinder.py", line 121, in get_jvm_path
1/20/2018 12:05:45 PM ERR undefined jvm = method()
1/20/2018 12:05:45 PM ERR undefined File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_jvmfinder.py", line 164, in _get_from_known_locations
1/20/2018 12:05:45 PM ERR undefined for home in self.find_possible_homes(self._locations):
1/20/2018 12:05:45 PM ERR undefined File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_jvmfinder.py", line 95, in find_possible_homes
1/20/2018 12:05:45 PM ERR undefined for childname in sorted(os.listdir(parent)):
1/20/2018 12:05:45 PM ERR undefined OSError: [Errno 2] No such file or directory: '/usr/lib/jvm'
1/20/2018 12:05:46 PM OUT undefined Exit status 1
Кто-нибудь знает, как я могу решить это?
1 ответ
После долгих проб и ошибок решение, которое работало для меня, представляло собой развертывание пакета с несколькими сборками, как описано ниже:
cf push -b https://github.com/cloudfoundry/multi-buildpack
и в корне вашего проекта включить multi-buildpack.yml
со следующим
buildpacks:
- https://github.com/cloudfoundry/apt-buildpack
- https://github.com/cloudfoundry/python-buildpack
и apt.yml
со следующим:
---
packages: openjdk-8-jre
repos: deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main
keys: https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB9B1D8886F44E2A
в runtime.txt
файл, (также в корне проекта) версия Pythonpython-3.6.6
К сожалению, JAVA устанавливается в вашем home deps
каталог и как таковой вам придется создать JAVA_HOME
переменная среды в manifest.yml
,
JAVA_HOME: /home/vcap/deps/0/apt/usr/lib/jvm/java-8-openjdk-amd64/jre/
Я также попытался добавить JRE / BIN к пути таким образом
PATH: /bin:/usr/bin:/home/vcap/deps/0/apt/usr/lib/jvm/java-8-openjdk-amd64/jre/bin
Однако push стирает это и устанавливает только путь по умолчанию /bin;/usr/bin
к счастью для меня, JAVA_HOME
было достаточно, чтобы получить jaydebapi
работать с драйвером базы данных для jar
файлы у меня были. Если вам нужна эта переменная среды, возможно, попробуйте использовать python
Пакет os для выдачи команды на изменение пути при запуске.
Чтобы включить более современный ответ. На момент написания этой статьи большинство (все стоящие) версии Cloud Foundry, с которыми вы столкнетесь, будут поддерживать сразу несколько сборочных пакетов. Таким образом, вам больше не нужен сборочный пакет multi-buildpack.
Вместо этого вы можете просто cf push
и укажите несколько пакетов сборки.
https://docs.cloudfoundry.org/buildpacks/use-multiple-buildpacks.html
Это можно сделать, установив несколько -b
флаги для cf push
или используя manifest.yml
file и сделаем что-то вроде этого:
...
buildpacks:
- buildpack_1
- buildpack_2
...
В любом случае выполняйте в том порядке, в котором вы их перечисляете.
https://docs.cloudfoundry.org/devguide/deploy-apps/manifest-attributes.html
Остальная часть ответа остается такой же, как ответ @lamonaki.
Вызовите как apt-buildpack, так и buildpack Python в указанном порядке.
Добавить
apt.yml
и укажите в нем пакет Java, который вы хотите установить.Ex из ответа @lamonaki:
--- packages: openjdk-8-jre repos: deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main keys: https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB9B1D8886F44E2A
Добавить
runtime.txt
чтобы установить версию Python, которую вы хотите установитьДобавить
.profile
файл в корень проекта, как иapt.yml
а такжеruntime.txt
. В этом добавьте строки дляexport JAVA_HOME=/home/vcap/deps/0/apt/usr/lib/jvm/java-8-openjdk-amd64/jre/
а такжеexport PATH=$PATH:$JAVA_HOME/bin
и потенциальноLD_LIBRARY_PATH
если вам нужно сослаться на какие-либо пользовательские общие библиотеки в коде Java или Python.
Вы можете подумать, почему apt-buildpack вместо Java buildpack. К сожалению, пакет сборки Java в его текущем воплощении поддерживает работу только в качестве последнего пакета сборки (т.е. последнего пакета сборки в списке пакетов сборки). Это исключает его как хорошего кандидата, поскольку вы хотите, чтобы пакет сборки Python был последним. Пакеты Java Cloud Native Buildpacks решат проблему, но пока я пишу это, нет никаких Cloud Native Buildpacks, которые изначально работают на CF.