您可以将 CLI 工具添加到 Cloud Foundry 应用程序吗?

Can you add CLI tools to a Cloud Foundry app?

非常抱歉,如果这是一个明显的问题。但是我有一个依赖 CLI 工具来让它工作的 webapp。我想知道是否有一种方法可以在不使用自定义构建包的情况下指定它。以及如果可能的话如何去做

任何帮助都将非常有用,谢谢

Can you add CLI tools to a Cloud Foundry app?

无法使用 aptapt-get 直接安装。您的应用 运行 是非特权用户,无法 运行 这些工具来安装东西。

这给您留下了几个选择:

  1. 获取二进制文件并将其与您的应用捆绑在一起。有些人(虽然我没有判断)会说你的应用程序负责将它需要的一切带到 运行 无论如何,所以你应该已经这样做了。

    Twelve-factor apps also do not rely on the implicit existence of any system tools. Examples include shelling out to ImageMagick or curl. [1]

    此路径适用于小型或自包含的依赖项,例如静态构建的 Go 应用程序。如果您的应用程序需要共享库或其他资源才能运行,您也需要将它们与您的应用程序捆绑在一起。如果您捆绑的内容很大,那也不是很好。您捆绑的所有内容都将与该应用程序一起推送,因此它可以减慢您的推送速度。您还负责跟踪更新并确保您拥有最新的、无错误和安全补丁的二进制文件和库。

    执行此操作的一般步骤是:

    1. 在您的应用程序根目录下创建一个类似 binaries/ 的文件夹,其中包含 bin/lib/.
    2. 的子文件夹
    3. 将所有二进制文件放在 binaries/bin 下,并将它们需要的任何共享库放在 binaries/lib 下。
    4. 在您的应用的根目录添加一个 .profile 文件。这将在您的应用程序启动之前获取,因此它将把您捆绑的所有二进制文件放在路径上并将库添加到搜索路径。

      .profile 中输入以下内容:

      export PATH=$HOME/binaries/bin:$PATH
      export LD_LIBRARY_PATH=$HOME/binaries/lib:$LD_LIBRARY_PATH
      

    应该是这样。只需使用所有新文件推送您的应用程序。

  2. 另一个更简单的选择是使用 Apt buildpack [2]。此 buildpack 可以使用 apt 安装所需的依赖项。你只需要添加一个 apt.yml 文件到你的应用程序的根目录和 运行 你的应用程序与 multi-buildpacks(首先是 apt buildpack,然后是你的普通 buildpack)。

    这样做的主要好处是您不必管理依赖项。 apt buildpack 会自动从你告诉它使用的 repo 安装它们,所以它也会从那里获取新版本。如果您需要安装的东西有很多依赖项,这很好,特别是敏感的依赖项(如 openssl)或 updated/patched 经常像其他语言 运行 次(Python、Perl、 Ruby, 等等...).

    其他好处。它更容易,因为 buildpack 负责调整 PATH & LD_LIBRARY_PATH。它还使应用程序的大小更小,因此推送速度更快。

    此选项的缺点是 apt-buildpack 不是官方构建包(它由社区维护)。当您可以访问 Internet 时,它也能发挥最佳作用,因此它可以从 Internet 下载二进制文件,尽管您可以使用内部存储库解决此问题。


还有其他几个选项,但我不会推荐它们,除非以上两个选项都绝对不适合您。

  1. 使用Docker。您可以设置自己的 Docker 容器,其中包含您需要的所有依赖项,加上您的应用程序代码和 cf push 将 Docker 图像上传到 CF。这样做的缺点是您失去了使用 buildpack 的优势,因此您又回到构建和管理 Docker 图像以及您应用程序所需的所有依赖项。

  2. 您可以创建自己的自定义构建包并以这种方式提供依赖项。不过,我看不出您有任何理由要这样做。这是一项体面的工作,最后,你会得到比 Apt Buildpack 更脆弱、更不灵活的东西。

  3. 从技术上讲,发布您自己的 rootfs 是可行的,但您真的不应该这样做(我只是将其包括在内是为了彻底说明)。这是 CF 上所有应用程序使用的基本文件系统。这样做有很多缺点,主要是它很困难。它还适用于基础上的所有应用程序,可以膨胀 rootfs 的大小,并为使用 rootfs 的任何东西(即所有应用程序)制造更大的攻击面。

希望对您有所帮助!