6.3. 在 RHEL 容器工具中实现可复现性。
要在构建过程中控制时间戳和其他非确定因素,您可以使用 RHEL 容器工具(如 Buildah、Podman 和 Skopeo)来实现构建可重复性。
RHEL 容器工具提供标准化、无守护进程和脚本化的工作流,以实现可重复性。这种方法可确保容器构建一次即可在任何位置一致运行,解决与依赖项、环境和版本相关的潜在问题。
- Buildah
- RHEL Buildah 通过对构建过程提供精细的控制来实现可重现的容器构建。它提供特定的选项来缓解非确定的 inism 的源,如不稳定的标签、文件系统元数据和主机依赖的数据。Buildah 使用固定时间戳进行可重现的构建。
标准时间戳是造成严重构建不可复现性的主要因素。默认情况下,文件创建和修改时间反映了文件添加到容器层的时间。Buildah 允许您将这些时间戳归零,或将其设置为特定的固定值。您可以使用以下选项进行可重复生成:
-
--rewrite-timestamp:此选项会将镜像层内容的时间戳重写为不晚于-source-date-epoch的时间。另外,控制镜像创建的时间戳以及其层中文件的时间戳,主要用于实现确定性构建。 --source-date-epoch:此选项比旧的timestamp选项更灵活,允许您为镜像层中的所有文件定义一个特定的、可重现的时间戳。它会影响镜像元数据中的创建和历史记录日期。您可以使用 CLI 标志、环境变量或 build-arg 来设置它。设置标志后,已声明的 ARG 会公开在RUN指令环境中,并获取静态主机名。另外,容器 ID 字段会在提交的镜像中被清除。- Podman
podman build命令虽然是面向用户的接口,但实际的镜像创建过程由 Buildah 库负责执行。Podman 采用了与 Buildah 相同的核心构建能力,而 Buildah 的设计重点是控制构建过程中各种非确定性因素,因此可实现可重现的容器构建。Podman 命令还接受
--rewrite-timestamp和--source-date-epoch选项。此外,--no-cache选项指示 Podman 忽略其本地缓存并执行全新的构建。使用此选项有助于验证您的容器镜像是否能够从零开始可靠地复现构建。- Skopeo
- Skopeo 通过引用不可变镜像摘要而不是可变标签来实现可复现的容器构建。Skopeo 主要传输和管理镜像,而 Buildah 等其他工具处理实际可重复生成的镜像创建。
使用 --source-date-epoch 和 --rewrite-timestamp 选项可以提高构建可重复性。但是,完全的可重复性无法保证。使用 COPY 指令的 --from 选项从其他镜像 添加的内容 可通过 RUN 指令的 --mount=from= 选项进行访问。您还可以使用 ADD 指令下载,但如果引用的镜像标签随后发生移动,或指定 URL 的内容发生变化,则构建结果可能会发生改变。