定制化openshit S2I
Openshift可以根据git repo的source code去创建应用。oc new-app根据git repo URL这个参数,然后去检测source code的编程语言,然后选择一个兼容的builder image.
这个自动检测机制是不完美的。但是oc new-app提供了许多定制化的参数去明确用户特定的需求。
Openshift是根据git repo URL的根路径下的文件来判断source code的编程语言。
如果openshift在根目录下发现Dockerfile, 可判断stragety是dockerfile而不是S2I, 发现pom.xml, 则可判断为java, 发现node.js, app.json, pakcage.json则可判定为Javascript, 发现composer.json, index.php则可判定为php等。
openshift用一个‘multi-step’算法去决定是否这个URL指向的是source code的repo, 如果是,应该基于哪个builder image去build。
算法详细流程如下:
判断是不是一个container registry URL, 如果是,则直接创建dc和其他部署一个container image所需要的资源。
如果指向的是个git repo, openshift从这个repo中获取file list, 如果找到Dockerfile,则build configuration使用的是docker strategy.如果不是,则build configuration使用的是source strategy. 而source strategy需要一个S2I builder image.
如果没有匹配的标记,openshift会搜索和这个language builder name名字匹配的image stream. 取第一个match的作为s2i builder image.
往openshift cluster中添加新的builder images是非常容易的。这些意味着, multiple builder images可以都会被潜在匹配到。 为了避免这种不确定,建议在oc new-app中制定策略以及要使用的image stream.
S2I build process
S21 build process牵涉到三个基础组件,整合在一起去创建一个最后的container image.
1. 应用的源代码
2. S2I 脚本
在build process过程中执行的一组脚本,用来定制化S2I builder image. S2I scripts可以用任何语言写,只要这些脚本在S2I builder image中是可以执行的。
3. S2I builder image
一个container image包含一个应用所需要的runtime environment. 它通常包含complier, interpreters, 脚本,和运行这个程序所需的其他的依赖。
S2I build process依赖许多S2I脚本, 而这些脚本会在build workflow的各个阶段被执行。
必须的这些脚本分别是:
1) assemble 主要是将source code放进image中合适的目录中。
2) run 运行这个应用
非必须的脚本是:
1) save-artifacts 集合这个应用所需要的所有依赖,保存下来去加速后续builds
2) usage 主要用于说明怎么使用这个image
3) test/run 允许你去创建一个简单的进程去验证这个image是不是正常工作。
S2I Build Workflow
基于S2I builder image去初始化一个container, 然后将源代码和S2I脚本打包成tar文件,然后这个tar文件会被放进container中。
在执行assemble脚本之前,这个上一步的tar文件会被解压,内容会被包在特定的位置,这个位置或者是通过--destination选项指定的或者是io.openshift.s2i.destination的label所指定。默认路径是/tmp.
如果这个是个增量氏的build,这个assemble脚本会用save-artifact脚本来恢复之前保存在tar文件中的build artifacts.
这个assemble脚本将source编译成application,然后将这个binaries放在合适的目录中。
如果这是个增量式的build, save-artifacts脚本会被执行,然后保存所有依赖的build artifacts到一个tar文件。
等这个assemble脚本执行完成,这个容器就会被提交以创建最后的image, 然后run脚本通常是这个最后image的CMD instruction.
Overriding S2I Builder Scripts
S2I builder image提供了他们自己默认的S2I脚本。你可以重新默认的S2I去定制这个应用该如何构建和执行。你可以重新默认build的行为而无需从新构建S2Ibuilder image, 或者你可以从原始的S2I builer中复制源码
为你的应用程序重写默认的S2I脚本的最简单的方法就是在应用的源码中包含你的S2I脚本。 你可以将你S2I脚本放在你源码的repo的.s2i/bin目录
当这个S2I进程被初始化,这个源代码的文件夹就会被检查,源码中的定制化的S2I脚本会和程序源码本身,被打包在一个tar文件中,然后被assemble在S2I builer image中。这个定制化的assemble脚本会替代默认脚本而被执行,随后其他的定制化的脚本也会紧跟着被执行