我们的目标是在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_ENV
或NODE_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