由于无法在防火墙后下载节点oracledb dep,因此在Cloud Foundry上运行的节点js应用程序失败

时间:2018-09-07 07:16:01

标签: node.js cloudfoundry

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

2 个答案:

答案 0 :(得分:1)

对于离线环境,您需要“供应商”您的依赖项。 “供应”行为是指您预先下载它们,并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堆栈上运行。您可以运行cf stacks来查看环境中可用的堆栈。

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

要将其恢复为供应Node.js依赖项,您需要在与堆栈匹配的环境中执行本地供应商操作。如果您运行的是Windows或MacOS,则意味着使用VM或Docker映像。在虚拟机或Docker映像方面,您有一些选择。

  • 堆栈(也称为rootfs)可作为Docker映像使用。您可以通过运行docker run -w /app -v pwd :/app -it cloudfoundry/cflinuxfs2 bashdocker run -w /app -v pwd :/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运行您的应用程序,并且构建包将运行,并且不需要从Internet下载任何内容。

答案 1 :(得分:1)

经过大量研究和实验,我能够在没有docker image的情况下实现这一目标。 在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依赖性而不是转到Internet的项目中的相对文件位置,则可以解决此问题。 如果我们提到- “ oracledb”:“ ^ 2.3.0”-即使您手动将oracledb复制到node_modules中并提供具有匹配体系结构的二进制文件,它始终会通过Internet下载特定于平台的二进制文件。我已经在oracledb 2.3.0中观察到了这种行为。 当我在本地提供oracledb 2.0.15时,我的问题得到解决。