由于未在防火墙后面下载节点 oracledb dep,云代工厂上的节点 js 应用程序失败

node js app over cloud foundry failing as node oracledb dep is not getting downloaded behind firewall

我有一个需要推送到 Cloud Foundry 的节点 js 应用程序。 oracle 二进制文件下载被防火墙阻止,因此 npm install 无法下载节点 oracledb 依赖项。我已将其手动安装在本地 node_modules 文件夹下。现在,当我将我的应用程序推送到 CF 时,它再次尝试下载节点 oracledb 依赖项,该依赖项已存在于本地 node_modules 文件夹中。 我的问题是如何在 package.json 或 package-lock.json 中提及这一点,以便 CF 不会在每次推送时下载节点 oracledb。我希望它只使用捆绑的依赖项。 P.S 添加代理在这里不起作用,因为此特定于平台的二进制文件托管在 S3.AWS 互联网上,并被我们的组织阻止。

对于离线环境,您需要 "vendor" 您的依赖项。 "vendoring" 的行为意味着您提前下载它们并且 cf push 您的应用程序和依赖项。当您这样做时,buildpack 不需要下载任何东西,因为它已经存在了。

Node.js 个应用程序的进程在这里 -> https://docs.cloudfoundry.org/buildpacks/node/index.html#vendoring

对于非本机代码,这很容易,但对于本机代码,这就很复杂了。要供应您的依赖项,您需要确保本地计算机的体系结构与目标计算机(即您的 Cloud Foundry 堆栈)的体系结构相匹配。如果体系结构不匹配,则二进制文件不会 运行 在 CF 上,buildpack 将需要尝试为您下载和构建这些资源(这在离线环境中会失败)。

在撰写本文时,有两个堆栈可用于 Cloud Foundry。最常用的是cflinuxfs2。这基本上是 Ubuntu Trusty 14.04。还有 cflinuxfs3 基本上是 Ubuntu Bionic 18.04。在我撰写本文时,后者是相当新的,可能并非在所有环境中都可用。还有 Windows 堆栈,但这与这里无关,因为 Node.js buildpack 在 Linux 堆栈上只有 运行s。您可以 运行 cf stacks 查看您的环境中可用的堆栈。

到 select 你想要的堆栈,运行 cf push -s <stack>,但这通常不是必需的,因为大多数环境默认使用 Linux 堆栈之一。

要将其带回销售您的 Node.js 依赖项,您需要在与堆栈匹配的环境中执行本地销售操作。如果您使用 运行ning Windows 或 MacOS,则意味着使用 VM 或 Docker 映像。在 VM 或 Docker 映像方面,您有几个选项。

  • 堆栈,也称为 rootfs,可作为 Docker 图像使用。您可以通过 运行ning docker run -w /app -vpwd:/app -it cloudfoundry/cflinuxfs2 bashdocker run -w /app -vpwd:/app -it cloudfoundry/cflinuxfs2 bash 来解决这个问题。这将在匹配的容器中为您提供 shell,您可以在其中 运行 销售流程。
  • 做同样的事情,但使用基础 Ubuntu Trusty 14.04 或 Ubuntu Bionic 18.04 图像。这些基本上与 cflinuxfsX 图像相同,它们只是随附一组库存包。如果您需要 apt 安装开发包以便构建本机代码,那没问题。
  • 创建一个 Ubuntu Trusty 14.04 或 Ubuntu Bionic 18.04 虚拟机。这与之前的选项相同,但您使用的是 VM 而不是 Docker.

一旦您使用正确的体系结构正确销售了您的依赖项,您应该能够 cf push 您的应用程序和 buildpack 将 运行 而无需从 Internet 下载任何内容。

经过大量研究和实验,我能够在没有 docker 图像的情况下实现这一目标。 在 package.json -

 "dependencies": {
    "crypto": "^1.0.1",
    "express": "^4.16.3",
    "morgan": "^1.9.0",
    "nan": "^2.11.0",
    "oracledb": "file:oracledb_build",
    "typeorm": "^0.2.7"
  }

如果我们提到项目中的相对文件位置,npm 应该从中查找 oracledb 依赖项而不是通过互联网,它解决了这个问题。 如果我们提到 - "oracledb": "^2.3.0" -- 它总是通过互联网下载平台特定的二进制文件,即使您手动将 oracledb 复制到 node_modules,并提供具有匹配体系结构的二进制文件。我在 oracledb 2.3.0 中观察到这种行为。 当我在本地提供 oracledb 2.0.15 时,我的问题得到了解决。