在CloudFoundry自定义构建包中集成OracleDB



我们的目标是在CloudFoundry中集成我们的Node.js WebService。由于我们需要oracledB模块来访问我们的数据库,因此我们被迫创建一个自定义构建pack(从CloudFoundry/nodejs-buildpack分叉(,该pack安装了所需的Oracle InstantClient。

s.Stager.BuildDir() + '/instantclient-basic'目录中下载并解压缩InstantClient和SDK之后,似乎我们必须将LD_LIBRARY_PATH变量设置为此路径。

因此,在/src/nodejs/supply/supply.go文件中,我们添加了以下代码行:

if err := s.Stager.WriteEnvFile("LD_LIBRARY_PATH", filepath.Join(s.Stager.BuildDir(), "instantclient-basic")); err != nil {
    return err
}

但是,在安装此构建pack时的日志输出中,它列出了其他变量,例如NODE_ENVNODE_HOME(以完全相同的方式设置(,我的变量LD_LIBRARY_PATH丢失了。我如何正确导出新的Env变量?

----响应丹尼尔·米库萨(Daniel Mikusa(的回答---

我尝试遵循.profile,包括InstantClient文件方法:

- controllers
- public
- instantclient
| --- libclntsh.so
| ... 
app.js
server.js
package.json
.profile

这就是.profile文件的样子:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/app/instantclient

仍然,当我从中创建.. thut a thage and adiva a new nodejs buildpack在我们的cloundfoundry上时,我会遇到与以前相同的错误:

错误错误:NJS-045:无法为Node.js 6.11.2(Linux,64(

加载OracledB附加二进制

err node.js require((错误是:

err dpi-1047:64位Oracle客户端库无法加载:&quort; libclntsh.so:无法打开共享对象文件:否此类文件或目录。

您在这里看到任何错误吗?

我将在此处引用Buildpack合同文档开始。

https://docs.cloudfoundry.org/buildpacks/custom.html#contract

您正在调用s.Stager.WriteEnvFile,您可以在此处看到源。

https://github.com/cloudfoundry/libbuildpack/blob/e915de2390c8dcc4fcc4f3a05dd747c76354545454335e26/

此方法正在编写一个env文件。从buildpack文档...

可以在/tmp/deps/idx/内部创建以下目录,以提供对后续buildpacks的依赖性:

...

  • /env:包含用于分期的环境vars,以filecontents = filecontents
  • 加载

因此,您添加的内容应该创建一个ENV文件,后续构建包可以使用。那是你打算的吗?

如果要在运行时设置ENV变量(即应用程序运行时(,则需要修改buildpack的此部分。

https://github.com/cloudfoundry/nodejs-buildpack/blob/master/src/src/nodejs/supply/supply/supply.go#l586-l593

    scriptContents := `export NODE_HOME=%s
export NODE_ENV=${NODE_ENV:-production}
export MEMORY_AVAILABLE=$(echo $VCAP_APPLICATION | jq '.limits.mem')
export WEB_MEMORY=${WEB_MEMORY:-512}
export WEB_CONCURRENCY=${WEB_CONCURRENCY:-1}
export LD_LIBRARY_PATH=/path/to/instant-client
`
    return s.Stager.WriteProfileD("node.sh", fmt.Sprintf(scriptContents, filepath.Join("$DEPS_DIR", s.Stager.DepsIdx(), "node")))

只需确保/path/to/instant-client与运行时容器相关,而不是在舞台容器中。路径可能会有所不同。


对于它的价值,我只建议在您有很多需要此调整的应用程序时就分叉构建包装。它需要维护才能保持构建包的电流,并且您不希望您的叉子落后,否则您可能会陷入旧版本的节点,或者您的buildpack提供的任何二进制文件可能具有安全性漏洞。

如果您只有一些应用程序,则应该能够将即时客户端与应用程序文件捆绑在一起。为此,只需将即时客户端提取到项目文件夹的子文件夹即可。然后将名为.profile的文件添加到项目文件夹的根部。在该文件中,添加LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/app/instant-client-folder

推动应用程序时,.profile文件将被采购。这将把即时客户端文件夹附加到LD_LIBRARY_PATH环境变量,这应该使其可用于您的应用程序。

有关.profile的更多详细信息 -> https://docs.cloudfoundry.org/devguide/deploy-apps/deploy-app.html#profile

最新更新