Добавление 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.

Другие вопросы по тегам