首页 > 解决方案 > node js app over cloud Foundry 失败,因为 node oracledb dep 没有在防火墙后面下载

问题描述

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

标签: node.jscloud-foundry

解决方案


对于离线环境,您需要“供应商”您的依赖项。“供应商”行为意味着您提前下载它们以及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 构建包仅在 Linux 堆栈上运行。您可以运行cf stacks以查看您的环境中可用的堆栈。

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

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

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

一旦您使用正确的架构正确地提供了您的依赖项,您应该能够cf push运行您的应用程序并且 buildpack 将运行,而无需从 Internet 下载任何内容。


推荐阅读