很抱歉,如果这是一个明显的问题。但是我有一个依靠CLI工具才能运行的webapp。我想知道是否有一种方法可以在不使用自定义buildpack的情况下指定它。以及如何尽可能做到这一点
在这方面的任何帮助都很好,谢谢
答案 0 :(得分:0)
您可以将CLI工具添加到Cloud Foundry应用程序吗?
不可能直接用apt
或apt-get
安装东西。您的应用以无特权的用户身份运行,并且无法运行那些工具来进行安装。
这为您提供了两个选择:
获取二进制文件并将其与您的应用程序捆绑在一起。有些人(虽然我没有判断力)会说您的应用程序负责使它无论如何都需要运行,因此您应该已经这样做了。
十二因子应用程序也不依赖于任何系统工具的隐式存在。示例包括脱壳到ImageMagick或curl。 [1]
此路径适用于较小或自包含的依赖项,例如静态构建的Go应用程序。如果您的应用需要共享库或其他资源才能运行,则也需要将它们与应用捆绑在一起。如果捆绑包的大小很大,也不太好。您捆绑的所有内容都将随该应用程序一起推送,因此会减慢您的推送速度。您还负责跟踪更新,并确保您拥有最新的,无错误和安全补丁的二进制文件和库。
执行此操作的一般步骤是:
binaries/
,其中包含bin/
和lib/
的子文件夹。binaries/bin
下,并将它们需要的所有共享库放在binaries/lib
下。在应用程序的根目录中添加一个.profile
文件。该资源将在您的应用启动之前获取,因此它将把您捆绑的所有二进制文件放在路径上,并将库添加到搜索路径。
在.profile
中输入以下内容:
export PATH=$HOME/binaries/bin:$PATH
export LD_LIBRARY_PATH=$HOME/binaries/lib:$LD_LIBRARY_PATH
应该的。只需将所有新文件推送到您的应用程序即可。
另一个更简单的选择是使用Apt buildpack [2]。该buildpack可以使用apt
安装所需的依赖项。您只需要在应用程序的根目录中添加一个apt.yml
文件,然后使用多个buildpacks(首先使用apt buildpack,然后使用常规的buildpack)运行您的应用程序即可。
这样做的主要好处是您不必管理依赖项。 apt buildpack将自动从您告诉它使用的存储库中安装它们,因此它将从那里也获取新版本。如果您需要安装的东西具有很多依赖关系,特别是敏感的依赖关系(如openssl)或经常像其他语言运行时(Python,Perl,Ruby等)那样得到更新/修补的依赖关系,则很好。
其他好处。这很容易,因为buildpack负责调整PATH和LD_LIBRARY_PATH。它还使应用程序尺寸更小,因此推送速度更快。
此选项的缺点是apt-buildpack不是官方的buildpack(由社区维护)。当您可以访问Internet时,它也最有效,因此它可以从Internet下载二进制文件,尽管您可以使用内部存储库解决此问题。
还有其他两个选项,但是除非上面两个选项对您都不起作用,否则我不推荐它们。
使用Docker。您可以使用所需的所有依赖项以及应用程序代码和cf push
Docker映像到CF来设置自己的Docker容器。这样做的缺点是您失去了使用buildpack的优势,因此您将自己重新构建和管理Docker映像以及应用程序的所有必需依赖项。
您可以创建自己的自定义buildpack并以这种方式提供依赖项。我没有看到您要这样做的任何理由。这是一项体面的工作,最后,您会得到比Apt Buildpack更脆,更不灵活的东西。
从技术上来说,可以发布自己的rootfs,但实际上不应该这样做(我只是为了透彻地介绍了这一点)。这是CF上所有应用程序使用的基本文件系统。但是,这样做有很多缺点,主要是很难做到。它也适用于基础上的所有应用程序,可以膨胀rootfs的大小,并为使用rootfs的任何内容(即所有应用程序)提供更大的攻击面。
希望有帮助!