Arch Linux 现在拥有位对位可复现的 Docker 镜像
Source: Hacker News
作为对几个月前我们 WSL 镜像达到的类似里程碑的后续,Arch Linux 现在拥有一个 逐位可复现的 Docker 镜像。
该镜像在 Docker Hub 上以全新的 repro 标签 分发: 。
可复现的 Docker 镜像
为了保证可复现性,镜像中已去除 pacman 密钥环。因此,pacman 无法直接使用。
在安装或更新软件包之前,必须在容器内部(重新)生成密钥环:
pacman-key --init && pacman-key --populate archlinux
你可以在首次启动时交互式运行此命令,或在将该镜像用作基础镜像时将其写入 RUN 语句。
Distrobox 用法
distrobox create -n arch-repro \
-i docker.io/archlinux/archlinux:repro \
--pre-init-hooks "pacman-key --init && pacman-key --populate archlinux"
可复现性验证
-
可以通过以下方式检查不同构建之间的摘要是否相同:
podman inspect --format '{{.Digest}}' -
diffoci工具可以比较构建之间的字节级差异: 。
关于如何复现该 Docker 镜像的文档请参见此处。
构建镜像
基础根文件系统的确定性构建复用了与 Arch Linux WSL 镜像相同的流程 ()。
Docker 特有的调整
-
Source date epoch – 设置
SOURCE_DATE_EPOCH并将其传播到 Dockerfile 中的org.opencontainers.image.created标签。 -
移除 ldconfig 辅助缓存 – 该文件会引入非确定性:
TYPE NAME INPUT-0 INPUT-1 File var/cache/ldconfig/aux-cache 656b08db599dbbd9eb0ec663172392023285ed6598f74a55326a3d95cdd5f5d0 ffee92304701425a85c2aff3ade5668e64bf0cc381cfe0a5cd3c0f4935114195 -
规范化时间戳 在
docker build/podman build时使用--source-date-epoch=$SOURCE_DATE_EPOCH和--rewrite-timestamp选项:TYPE NAME INPUT-0 INPUT-1 File etc/ 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File etc/ld.so.cache 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File etc/os-release 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File sys/ 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File var/cache/ 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File var/cache/ldconfig/ 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File proc/ 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC File dev/ 2026-03-31 07:57:46 +0000 UTC 2026-03-31 07:59:21 +0000 UTC
你可以在 archlinux‑docker 仓库中查看完整的变更集: 。
致谢与后续计划
感谢 Mark 在此工作中的帮助!
此里程碑推动了 Arch Linux 更广泛的“可复现构建”倡议。展望未来,我正在考虑为该 Docker 镜像(以及WSL 镜像)设置自动重建器,以定期重建、验证可复现性并公开发布构建日志。 🤗