如何在 Google App Engine Flex 上使用 Python cx_Oracle 包连接到外部 Oracle 数据库?

How do I connect to an external Oracle database using the Python cx_Oracle package on Google App Engine Flex?

我的 Python App Engine Flex 应用程序需要连接到外部 Oracle 数据库。目前我正在使用 cx_Oracle Python package which requires me to install the Oracle Instant Client

我已通过 Instant Client installation steps 在本地(在 macOS 上)成功 运行。这些步骤要求我执行以下操作:

  1. 创建一个名为 /opt/oracle
  2. 的目录
  3. 创建从 /opt/oracle/instantclient_12_2/libclntsh.dylib.12.1~/lib/
  4. 的符号链接

但是,我对如何在 App Engine Flex 中做同样的事情感到困惑 (instructions)。具体来说,这是我感到困惑的地方:

  1. 说明说我应该 运行 sudo yum install libaio 安装 libaio 包。我如何在 GAE Flex 上执行此操作?或者这个包已经可用了吗?
  2. 我想我可以将 Instant Client 文件添加到 GAE(高达 ~100MB!),然后将 app.yaml 中的 LD_LIBRARY_PATH 环境变量设置为 export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2:$LD_LIBRARY_PATH。这行得通吗?
  3. 如果不在 App Engine Flex 上使用自定义 Docker 容器,这是否可行?

总的来说,我不确定我是否在正确的轨道上。很想听听以前处理过此问题的人的意见:)

回答你的第一个问题,我认为 oracle 网站上的说明只是表明你必须安装所述库才能使你的应用程序正常工作。

对于 App Engine flex,他们确保部署中存在库的方法是使用 requirements.txt 文本文件。有一个 documentation 页面解释了如何这样做。

另一方面,我假设"Instant Client Files"不是库,而是你的应用程序到运行的必要数据。您应该使用 Google Cloud Storage 或 Google Cloud 中的任何其他 alternative of Storage 来为它们提供服务。

我相信,如果这就是您的应用运行所需要的全部,那么推送您自己的自定义容器就没有必要了。

如果您的任何依赖项在 Google 提供的基本 GAE flex 映像中不可用并且无法通过 pip 安装(因为它不是 python 包或者不是在 PyPI 或任何其他原因中可用)那么你不能使用 requirements.txt 文件将它安装在你的 GAE flex 应用程序中。

满足此类依赖关系的正确方法是构建您自己的自定义运行时。来自 About Custom Runtimes:

Custom runtimes allow you to define new runtime environments, which might include additional components like language interpreters or application servers.

是的,这意味着提供自定义 Docker 文件。在您的特定情况下,您将在此 Docker 文件中安装 Instant Client 和 libaio。另见 Building Custom Runtimes