5.2. Source-to-image 构建
Source-to-Image (S2I) 是一种用于构建可重复生成的容器镜像的工具。它通过将应用程序源代码注入容器镜像并汇编新镜像来生成可随时运行的镜像。新镜像融合了基础镜像(构建器)和构建的源代码,并可搭配 buildah run
命令使用。S2I 支持递增构建,可重复利用以前下载的依赖项和过去构建的工件等。
5.2.1. 执行 source-to-image 增量构建
Source-to-image (S2I) 可以执行增量构建,也就是能够重复利用过去构建的镜像中的工件。
流程
要创建增量构建,请创建对策略定义进行以下修改:
strategy: sourceStrategy: from: kind: "ImageStreamTag" name: "incremental-image:latest" 1 incremental: true 2
其他资源
- 如需有关如何创建支持增量构建的构建器镜像的信息,请参阅 S2I 要求。
5.2.2. 覆盖 source-to-image 构建器镜像脚本
您可以覆盖构建器镜像提供的 assemble
、run
和 save-artifacts
source-to-image(S2I)脚本。
流程
要覆盖构建器镜像提供的
assemble
、run
和save-artifacts
S2I 脚本,请完成以下操作之一:-
在应用程序源存储库的
.s2i/bin
目录中提供assemble
、run
或save-artifacts
脚本。 提供包含脚本的目录 URL,作为
BuildConfig
对象中的策略定义的一部分。例如:strategy: sourceStrategy: from: kind: "ImageStreamTag" name: "builder-image:latest" scripts: "http://somehost.com/scripts_directory" 1
- 1
- 构建过程将
run
、assemble
和save-artifacts
附加到路径中。如果存在具有这些名称的任何或所有脚本,构建过程将使用这些脚本代替镜像中提供的同名脚本。
注意位于
scripts
URL 的文件优先于源存储库的.s2i/bin
中的文件。
-
在应用程序源存储库的
5.2.3. Source-to-image 环境变量
可以通过两种方式将环境变量提供给源构建过程使用,并生成镜像:环境文件和 BuildConfig
环境值。您使用任一方法提供的变量将在构建过程中和输出镜像中存在。
5.2.3.1. 使用 Source-to-image 环境文件
利用源代码构建,您可以在应用程序内设置环境值(每行一个),方法是在源存储库中的 .s2i/environment
文件中指定它们。此文件中指定的环境变量存在于构建过程和输出镜像。
如果您在源存储库中提供 .s2i/environment
文件,则 source-to-image(S2I)会在构建期间读取此文件。这允许自定义构建行为,因为 assembe
脚本可能会使用这些变量。
流程
例如,在构建期间禁用 Rails 应用程序的资产编译:
-
在
.s2i/environment
文件中添加DISABLE_ASSET_COMPILATION=true
。
除了构建之外,指定的环境变量也可以在运行的应用程序本身中使用。例如,使 Rails 应用程序在 development
模式而非 production
模式中启动:
-
在
.s2i/environment
文件中添加RAILS_ENV=development
。
使用镜像部分中提供了各个镜像支持的环境变量的完整列表。
5.2.3.2. 使用 Source-to-image 构建配置环境
您可以在构建配置的 sourceStrategy
定义中添加环境变量。这里定义的环境变量可在 assemble
脚本执行期间看到,也会在输出镜像中定义,使它们能够供 run
脚本和应用程序代码使用。
流程
例如,禁用 Rails 应用程序的资产编译:
sourceStrategy: ... env: - name: "DISABLE_ASSET_COMPILATION" value: "true"
其他资源
- “构建环境”部分提供了更多高级指导。
-
您还可以使用
oc set env
命令管理构建配置中定义的环境变量。
5.2.4. 忽略 source-to-image 源文件
Source-to-Image(S2I) 支持 .s2iignore
文件,该文件包含了需要被忽略的文件列表。构建工作目录中的文件(由各种输入源提供)若与 .s2iignore
文件中指定的文件匹配,将不会提供给 assemble
脚本使用。
5.2.5. 使用 Source-to-image 从源代码创建镜像
Source-to-Image (S2I) 是一种框架,它可以轻松地将应用程序源代码作为输入,生成可运行编译的应用程序的新镜像。
使用 S2I 构建可重复生成的容器镜像的主要优点是便于开发人员使用。作为构建器镜像作者,您必须理解两个基本概念,构建过程和 S2I 脚本,才能让您的镜像提供最佳的 S2I 性能。
5.2.5.1. 了解 source-to-image 构建过程
构建过程包含以下三个基本元素,这些元素组合成最终的容器镜像:
- 源
- Source-to-image(S2I)脚本
- 构建器镜像
S2I 生成带有构建器镜像的 Dockerfile 作为第一个 FROM
指令。然后,由 S2I 生成的 Dockerfile 会被传递给 Buildah。
5.2.5.2. 如何编写 Source-to-image 脚本
您可以使用任何编程语言编写 S2I 脚本,只要脚本可在构建器镜像中执行。S2I 支持多种提供 assemble
/run
/save-artifacts
脚本的选项。每次构建时按以下顺序检查所有这些位置:
- 构建配置中指定的脚本。
-
在应用程序源
.s2i/bin
目录中找到的脚本。 -
在默认镜像 URL 中找到的带有
io.openshift.s2i.scripts-url
标签的脚本。
镜像中指定的 io.openshift.s2i.scripts-url
标签和构建配置中指定的脚本都可以采用以下形式之一:
-
image:///path_to_scripts_dir
:镜像中 S2I 脚本所处目录的绝对路径 -
file:///path_to_scripts_dir
:主机上 S2I 脚本所处目录的相对或绝对路径 -
http(s)://path_to_scripts_dir
:S2I 脚本所处目录的 URL
脚本 | 描述 |
---|---|
|
|
|
|
|
这些依赖项会收集到一个 |
|
借助 |
|
借助
注意
建议将 |
S2I 脚本示例
以下示例 S2I 脚本采用 Bash 编写。每个示例都假定其 tar
内容解包到 /tmp/s2i
目录中。
assemble
脚本:
#!/bin/bash # restore build artifacts if [ "$(ls /tmp/s2i/artifacts/ 2>/dev/null)" ]; then mv /tmp/s2i/artifacts/* $HOME/. fi # move the application source mv /tmp/s2i/src $HOME/src # build application artifacts pushd ${HOME} make all # install the artifacts make install popd
run
脚本:
#!/bin/bash # run the application /opt/application/run.sh
save-artifacts
脚本:
#!/bin/bash pushd ${HOME} if [ -d deps ]; then # all deps contents to tar stream tar cf - deps fi popd
usage
脚本:
#!/bin/bash # inform the user how to use the image cat <<EOF This is a S2I sample builder image, to use it, install https://github.com/openshift/source-to-image EOF
其他资源
5.2.6. 使用构建卷
您可以挂载构建卷,为运行的构建授予您不想在输出容器镜像中保留的信息的访问权限。
构建卷提供仅在构建时需要的敏感信息,如存储库凭据。构建卷与构建输入不同,后者的数据可以保留在输出容器镜像中。
构建卷的挂载点(运行中的构建从中读取数据)在功能上与 pod 卷挂载 类似。
先决条件
- 您已将输入 secret、配置映射或两者添加到 BuildConfig 对象中。
流程
在
BuildConfig
对象的sourceStrategy
定义中,将任何构建卷添加到volumes
数组中。例如:spec: sourceStrategy: volumes: - name: secret-mvn 1 mounts: - destinationPath: /opt/app-root/src/.ssh 2 source: type: Secret 3 secret: secretName: my-secret 4 - name: settings-mvn 5 mounts: - destinationPath: /opt/app-root/src/.m2 6 source: type: ConfigMap 7 configMap: name: my-config 8
其他资源