在 Python Flask Cloud Foundry/IBM Cloud 应用程序中添加 Java/JRE/JVM

Add Java/JRE/JVM in Python Flask Cloud Foundry/IBM Cloud application

我正在 运行在云 Foundry/IBM 云环境中安装 python flask 应用程序。在我的应用程序中,我尝试使用 IBMDBPY 包连接到 DB2 Warehouse on Cloud。这个包需要一个名为 jaydebeapi 的包才能 运行。为了让 jaydebeapi 工作,我想我需要 JRE/JVM 以某种方式安装在服务器上。我尝试为基于 Linux 的 OS 添加 Server JRE,但它也没有用。我在尝试上传 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

有谁知道我该如何解决这个问题?

经过反复试验,对我有用的解决方案是如下所述的多构建包部署:

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文件中,(也在项目的根目录中)是python的版本 python-3.6.6

不幸的是,JAVA 安装在您的 home deps 目录中,因此您必须在 manifest.yml.[=27 中创建一个 JAVA_HOME 环境变量=]

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

然而,推送消除了这一点,只安装了默认路径 /bin;/usr/bin 对我来说幸运的是,JAVA_HOME 足以让 jaydebapi 与 [=] 的数据库驱动程序一起工作25=] 我有的文件。如果你需要这个环境变量, 也许尝试使用 python os 包发出命令来修改路径作为启动的一部分。

包括更现代的答案。在我撰写本文时,您遇到的大多数(所有值得使用的)Cloud Foundry 版本都支持开箱即用的多个构建包。因此,您不再需要 multi-buildpack buildpack。

相反,您可以简单地 cf push 并指定多个构建包。

https://docs.cloudfoundry.org/buildpacks/use-multiple-buildpacks.html

这可以通过将多个 -b 标志设置为 cf push 或使用 manifest.yml 文件并执行如下操作来完成:

...
buildpacks:
  - buildpack_1
  - buildpack_2
...

无论哪种情况,都按照您列出的顺序执行。

https://docs.cloudfoundry.org/devguide/deploy-apps/manifest-attributes.html#buildpack

其余答案与@lamonaki 的答案相同。

  • 按顺序调用 apt-buildpack 和 Python buildpack。

  • 添加 apt.yml 文件并在其中指明要安装的 Java 包。

    @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.ymlruntime.txt一样。其中,如果您需要在 Java 或 Python 代码中引用任何自定义共享库,请为 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 添加行。

您可能会想,为什么要使用 apt-buildpack 而不是 Java buildpack。不幸的是,当前版本的 Java 构建包仅支持 运行ning 作为最终构建包(即构建包列表中的最后一个构建包)。这将它排除在外,因为您希望 Python buildpack 排在最后。 Java Cloud Native Buildpacks 将解决该问题,但在我撰写本文时,CF 上没有 运行 原生的 Cloud Native Buildpacks。