如何在自定义Cloud Foundry buildpack中使用其他rubygems?

时间:2017-03-09 17:50:43

标签: cloudfoundry

我正在编写一个自定义的java-buildpack,我希望能够编辑web.xml文件以添加一些必需的配置。但是,我似乎仅限于实例节点上存在的rubygems,它不包含任何XML解析库。

如何让buildpack指定需要额外的gem才能执行?将gems文件添加到buildpack本身的Gemfile中并不会在暂存应用程序时产生任何影响。

或者,如何仅使用CF中可用的库存设施修改现有XML文件?我想避免使用正则表达式,但这可能是最后的手段。

2 个答案:

答案 0 :(得分:2)

  

但是,我似乎仅限于实例节点上存在的rubygems,它不包含任何XML解析库。

正确。当您的构建包在登台容器中运行时,它将使用容器提供的Ruby版本。这意味着您将被锁定到特定版本的Ruby和容器提供的一组gem。

唯一的解决方法是使用一个bootstrap shell脚本来下载Ruby,安装你的Gems,然后运行实际的构建包Ruby脚本。这是一项额外的工作和开销,所以如果你能避免它,可能不是一个好的选择。

  

如何让buildpack指定需要额外的gem才能执行?在暂存应用程序时,将gems文件添加到buildpack本身的Gemfile中似乎没有任何效果。

我不认为这是可能的。你不能gem install因为它需要root访问权限,你就不会有。{/ p>

您可以做的是在构建包中包含所需的依赖项。我们使用YAML依赖为PHP构建包做到了这一点。如果您的依赖项是所有Ruby代码(即没有本机代码),那么这应该可以正常工作。

  

或者,如何仅使用CF中可用的库存设施修改现有XML文件?我想避免使用正则表达式,但这可能是最后的手段。

这取决于你正在做什么以及你需要改变什么。

  • 正则表达式搜索和替换是一种选择。
  • 基本字符串搜索和替换是另一种。
  • 您可以使用安装在环境中的工具,并且能够解析/编辑XML
  • 如果在安装Java之后的安装中稍后发生,则可以运行一些Java代码。

我不建议创建自定义堆栈。它具有令人难以置信的侵入性,意味着您需要提供所有未来的更新(不是一项小任务),如果您打算使用公共云提供商,这不会起作用,因为没有人会允许您安装您的公共云中的自定义堆栈。

希望有所帮助!

答案 1 :(得分:1)

您可以为此目的创建包含所有必需库的自定义堆栈(容器根fs)。

https://docs.cloudfoundry.org/devguide/deploy-apps/stacks.html

https://docs.cloudfoundry.org/adminguide/custom-stack.html