使用 Source-to-Image 构建容器镜像入门

S2I 可以轻松重现一致的容器镜像,因此开发人员可以专注于应用程序,而不是如何部署它们。
136 位读者喜欢这篇。
How Kubernetes is helping Docker blossom

Maersk Line. CC SA-BY 4.0

Source-to-Image 是一个极好的工具,可以以快速、灵活和可重现的方式为应用程序构建容器镜像。通常缩写为 S2I,Source-to-Image 采用一个基础的“构建器”镜像,其中包含编译应用程序或安装依赖项(如 Python 的 PIP 或 Ruby 的 Bundler)所需的所有库和构建工具,以及一组位于预定义位置的脚本,用于构建、测试和运行应用程序。创建构建器镜像后,S2I 可以从存储库中获取代码,将其注入到构建镜像中,编译或安装依赖项,并生成一个包含最终应用程序的应用镜像,随时可以运行。

我开始学习如何为用 Go(非正式地称为 Golang)编写的应用程序构建容器镜像,在接下来的两篇文章中,我们将这样做。

为什么选择 S2I

S2I 为构建可重现性的挑战提供了一个简单的解决方案,适用于用任何编程语言编写的应用程序。这意味着我可以重现一致的镜像,以便开发人员专注于他们的应用程序,而不是容器镜像和编排。而且,由于构建环境是提前创建的,因此构建所需的时间仅与应用程序编译或配置所需的时间一样长(使用Go 编译器背后的技术,速度可能非常快)。

我认为 S2I 的真正优点是能够使用构建器镜像作为模板,以便可以部署具有相似配置的相似应用程序,而无需为每个应用程序管理像 Dockerfile 这样的配置文件——为相似的应用程序提供相同的、可重现的环境。更少的模板化镜像意味着减少了管理它们更新的繁琐工作,并且更有可能让我相信它们能保持最新状态。

许多官方 Source-to-Image 构建器镜像已经存在(例如,Python S2IRuby S2I),但也很容易制作一个满足特定需求的镜像。

S2I 要求

要使构建成为 S2I 兼容的镜像,只需要四个文件,尽管还有一些文件可能会派上用场。以下内容直接来自 S2I README 文档

文件 必需? 描述
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 应用程序,则 assemble 脚本可能会运行 pip install 以从 requirements.txt 文件中安装依赖项。对于 Go,assemble 脚本将运行 go get 等命令。

s2i/bin/run 脚本应设置为 Dockerfile 中的 CMDENTRYPOINT,并负责在应用程序镜像运行时启动应用程序。在大多数情况下,此脚本是必需的,因为 S2I 构建生成的镜像就是运行应用程序的镜像。对于 Go 构建器,这不是绝对必要的,但它有助于测试应用程序。

s2i/bin/save-artifacts 脚本获取应用程序运行所需的所有工件,并通过 tar 命令将其流式传输到 stdout。这允许构建器镜像执行增量构建,或者使我们能够提取编译后的二进制文件,以便将其包含在后续构建中。

这些脚本文件可以用任何语言编写,只要它们可以在从 Dockerfile 构建的容器中执行即可。

注意: 尽管文档如此说,但 test/test-app 文件不是必需的。 如果您使用 s2i create 命令来构建新的 Source-to-Image 构建器,则会为您设置一些空白测试,但它们不是绝对必要的。 此外,run 脚本对于大多数 Source-to-Image 构建器都是必需的,但对于我们将在此系列中创建的 Golang 构建器镜像,它只是一个便利的脚本。

我们还需要 Source-to-Image 软件来构建运行时或应用程序镜像,但它不一定必须安装在本地系统上。我们可以在 OKD 或 OpenShift Container Platform 中创建整个构建管道,并在那里完成所有构建。 只是在本地安装软件来开发和测试镜像更容易。

获取适用于您平台的 最新版本的 Source-to-Image,或者使用您的发行版的软件包管理器安装它(例如,dnf install s2i)。

我们现在已经安装了 S2I,并且对开始设计构建器需要什么有了很好的了解。 在下一篇文章中,我们将介绍 Dockerfile 配置的良好实践(包括避免 root 权限),并查看一个构建示例。

随着我们继续进行四部分系列文章,我们将逐步完成使用 S2I 要求,然后为用 Go 编写的应用程序构建镜像模板,最后介绍如何将 S2I 与 OKD 或 OpenShift Container Platform buildConfigs 结合使用来自动化镜像构建管道。 您对是否应该使用 S2I 有疑问吗? 请在评论中随意提问。

接下来阅读
标签
Chris Collins
Chris Collins 是 Red Hat 的 SRE 和 OpenSource.com 特约记者,对自动化、容器编排及其周围的生态系统充满热情,并喜欢在家里重新创建企业级技术以供娱乐。

2 条评论

谢谢,看起来不错。

容器的最佳软件镜像

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.