×

Source-to-image (S2I) 构建器镜像包含组装和运行脚本,但这些脚本的默认行为并不适用于所有用户。您可以自定义包含默认脚本的 S2I 构建器的行为。

调用嵌入在镜像中的脚本

构建器镜像提供了它们自己版本的 source-to-image (S2I) 脚本,这些脚本涵盖了最常见的用例。如果这些脚本无法满足您的需求,S2I 提供了一种通过在.s2i/bin目录中添加自定义脚本来覆盖它们的方法。但是,这样做会完全替换标准脚本。在某些情况下,替换脚本是可以接受的,但在其他情况下,您可以运行一些命令在脚本之前或之后运行,同时保留镜像中提供的脚本的逻辑。要重用标准脚本,您可以创建一个包装器脚本,该脚本运行自定义逻辑并将进一步的工作委托给镜像中的默认脚本。

步骤
  1. 查看io.openshift.s2i.scripts-url标签的值以确定构建器镜像内脚本的位置

    $ podman inspect --format='{{ index .Config.Labels "io.openshift.s2i.scripts-url" }}' wildfly/wildfly-centos7
    示例输出
    image:///usr/libexec/s2i

    您检查了wildfly/wildfly-centos7构建器镜像,并发现脚本位于/usr/libexec/s2i目录中。

  2. 创建一个脚本,其中包含其他命令中包装的标准脚本之一的调用

    .s2i/bin/assemble脚本
    #!/bin/bash
    echo "Before assembling"
    
    /usr/libexec/s2i/assemble
    rc=$?
    
    if [ $rc -eq 0 ]; then
        echo "After successful assembling"
    else
        echo "After failed assembling"
    fi
    
    exit $rc

    此示例显示了一个自定义组装脚本,该脚本打印消息,运行来自镜像的标准组装脚本,并根据组装脚本的退出代码打印另一条消息。

    包装运行脚本时,必须使用exec来调用它,以确保正确处理信号。使用exec还会阻止在调用默认镜像运行脚本后运行其他命令的能力。

    .s2i/bin/run脚本
    #!/bin/bash
    echo "Before running application"
    exec /usr/libexec/s2i/run