Source-to-Image是一个很好的工具,是以快速,灵活,可再生的方式构建容器图像的应用。Source-to-Image通常缩写为S2I,它采用一个基本的“builder”映像,其中包含编译应用程序或安装依赖项(如Python的PIP或Ruby的Bundler)所需的所有库和构建工具,以及一组位于预定义位置的脚本,这些脚本用于构建、测试和运行应用程序。一旦构建器映像被创建,S2I就可以从存储库中获取代码,将其注入构建映像,编译或安装依赖项,并生成一个应用程序映像,使最终应用程序准备就绪。
对于用任何编程语言编写的应用程序,S2I为构建可再现性的挑战提供了一个简单的解决方案。这意味着我可以重现一致的图像,使开发人员能够专注于他们的应用程序,而不是容器图像和编排。而且,由于构建环境是提前创建的,因此构建只需要应用程序编译或配置所需的时间(使用Go编译器背后的技术可以非常快)。
在我看来,S2I的真正优点是能够使用builder映像作为模板,这样就可以部署具有类似配置的类似应用程序,而无需为每个应用程序管理配置文件(如dockerfile),从而为类似应用程序提供相同、可重复的环境。更少的模板化图像意味着管理其更新的工作不那么繁忙,而且我相信它们很可能可以保持最新。
许多官方的图像生成器源已经存在(例如,Python S2i,Ruby S2i),但是制作一套套装的特定需求也很简单。
构建一个与S2I兼容的图像只需要四个文件,不过还有一些文件可以派上用场。以下内容直接来自S2I自述文件:
文档 | 是否要求 | 描述 |
---|---|---|
Dockerfile | 是 | 定义基本生成器图像 |
s2i/bin/assemble | 是 | 构建应用程序的脚本 |
s2i/bin/usage | 否 | 打印生成器用法的脚本 |
s2i/bin/run | 是 | 运行应用程序的脚本 |
s2i/bin/save-artifacts | 否 | 用于保存生成工件的增量生成的脚本 |
test/run | 否 | 生成器映像的测试脚本 |
test/test-app | 是 | 测试应用程序源代码 |
生成器映像是从Dockerfile创建的,因此Dockerfile将包含编译、生成和运行源代码所需的所有包和库。Dockerfile还需要将s2i/bin/*和test/*文件复制到生成的图像中,以允许s2i使用它们。
s2i/bin/assemble脚本包含构建应用程序或安装其依赖项的逻辑。例如,如果构建器映像是针对Python应用程序的,那么汇编脚本可能会运行pip install来安装requirements.txt文件中的依赖项。对于Go,汇编脚本将运行Go-get等。
s2i/bin/run脚本应设置为Dockerfile中的CMD或ENTRYPOINT,并负责在应用程序映像运行时启动应用程序。在大多数情况下,此脚本是必需的,因为运行应用程序的是S2I构建产生的图像。对于Go构建器来说,它并不是严格必要的,但它对于测试应用程序是有帮助的。
s2i/bin/save artifacts脚本获取应用程序运行所需的所有工件,并通过tar命令将它们流式传输到stdout。这允许构建器映像进行增量构建,或使我们能够提取已编译的二进制文件,以便将其包含在后续构建中。
这些脚本文件可以用任何语言编写,只要它们可以在由Dockerfile构建的容器中执行。
注意:尽管文档说明了这一点,但并不需要测试/测试应用程序文件。如果使用s2i create命令将新的源代码构建到Image builder,则会为您设置一些空白测试,但这些测试并不是严格必要的。此外,大多数源代码到映像生成器都需要运行脚本,但对于我们将在本系列中创建的Golang生成器映像,这只是一种方便。
我们还需要源到映像软件来构建运行时映像或应用程序映像,但它不一定要安装在本地系统上。我们可以在OKD或OpenShift容器平台中创建整个构建管道,并在那里完成所有构建。使用本地安装的软件开发和测试映像更容易。
为您的平台获取源到映像的最新版本,或使用发行版的包管理器安装它(例如,dnf install s2i)。
我们现在已经安装了S2I,并且很好地理解了如何开始设计我们的构建器。在下一篇文章中,我们将介绍Dockerfile配置的良好实践(包括避免使用根权限),并查看构建示例。
在我们继续这个由四部分组成的系列时,我们将使用S2I需求,然后为Go编写的应用程序构建一个图像模板。最后,如何将S2I与OKD或OpenShift Container Platform buildConfigs一起使用,以自动生成图像管道。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。