在 Cloud Native Buildpack 中实现类似 'Entrypoint' 的功能

Implement 'Entrypoint' like functionality in Cloud Native Buildpack

我有一个 multi-process 网络应用程序。这些进程由不同的构建包提供。默认进程将启动 Web 应用程序。我有一个用例,其中应在默认进程调用之前执行给定的 shell 脚本。

我试过以下方法;

  1. 创建自定义构建包
  2. 创建一个需要执行的脚本,并调用其中的web进程。
  3. 通过在 launch.toml 定义
  4. 中指定,基于上述 shell sciprt 创建一个新进程
  5. 使 buildpack 可启动

entrypoint.sh

#!/usr/bin/env bash

# Some fancy stuff.. 

#Invoke the web process  
/cnb/process/web

从 custom-buildpack 的构建脚本创建 lauch.toml。将入口点进程设置为默认进程。

    cat > "$layers_dir/launch.toml" << EOL
    
    [[processes]]
    type = "entrypoint"
    command = "bash"
    args = ["$scriptlayer/bin/entrypoint.sh"]
    default = true
    
    EOL
    
    echo -e '[types]\nlaunch = true' > "$layers_dir/assembly-scripts.toml"

截断 pack inspect-image 输出

Processes:
  TYPE                        SHELL        COMMAND          ARGS
  entrypoint (default)        bash         bash        /layers/gw_assembly-scripts/assembly-scripts/bin/entrypoint.sh
  task                                     bash             catalina.sh run
  tomcat                                   bash             catalina.sh run
  web                                      bash             catalina.sh run

是否有更好的 CNB 原生方法来实现此用例?

这里有几个选项:

  1. 最简单的选择是将 .profile 脚本添加到应用程序的根目录。这是一个 bash 脚本,因此您可以在 bash 中编写任何内容,但是,它主要用于初始化您的应用程序和设置其他环境变量。

    此文件 运行s 在您进程类型中的命令之前。我查找了有关此行为的文档,但只找到了 briefly mentioned in the buildpacks spec.

    例如,如果我将 .profile 放在应用程序的根目录和该文件中,我会写 echo 'Hello World!'。在我的任何流程类型执行之前,我会看到 Hello World! 打印出来。

  2. 如果你想创建一个构建包,你可以通过让你的构建包包含一个 exec.d binary.

    来实现类似于 .profile 脚本的东西

    这是一个二进制文件,它是您的启动映像的一部分,并在您的任何进程类型之前获得 运行。它允许您在应用程序启动之前采取操作来初始化应用程序并动态设置其他环境变量。

    buildpack 作者经常使用此机制根据环境变量或 Kubernetes 服务绑定的更改在 运行 时提供动态行为。例如,转向 on/off 功能,如 APM 工具、调试和指标。

其他一些杂项。

  1. 以上选项均不允许您更改实际进程类型。在这些选项(.profileexec.d)运行 之前选择将要执行的进程类型,您不能从内部影响它。您只能将它们用于 运行 进程类型 运行ning.

    之前的事物
  2. buildpack 规范不允许一个 buildpack 修改另一个 buildpack 的进程类型。因此,您不能创建一个 buildpack 来包装或修改由另一个 buildpack 设置的进程类型。也就是说,一个 buildpack 可以覆盖另一个 buildpack 设置的进程类型。订单组中靠后的构建包将覆盖靠前的构建包。

    来自规范:A combined processes list derived from all launch.toml files such that process types from later buildpacks override identical process types from earlier buildpacks.

  3. 对于构建包,entrypoint 始终是 launcherlauncher is a process that runs and implements the application side of the buildpack specification。它 运行s .profileexec.d 二进制文件,设置 buildpack 提供环境变量并最终启动指定的进程类型。

    如果您 override the entrypoint for a container 那么启动器将不会 运行 并且 none 它应该做的事情将会发生。有时这是需要的,比如如果您正在排除故障,但通常您希望启动器成为入口点。