跳到主要内容

更新我们的默认 Docker 镜像

TL;DR: 我们对 Docker 镜像和构建时 GLIBC 选择进行了一些更新。

  1. 我们已更新默认 Docker 镜像,使其基于 alma9
  2. 现在可以更轻松地覆盖 c_stdlib_version(特别是对于启用 CUDA 的 feedstock),尽管我们的 2.17 基线没有改变。
  3. 在必要时,您可以通过设置 os_version: ... 更轻松地切换镜像(见下文)。
  4. 我们已整合镜像名称以遵循一致的模式
linux-anvil-{x86_64,aarch64,ppc64le}:{cos7,alma8,alma9}

通常,在绝大多数情况下,无需覆盖 docker-image,但如果您需要这样做,可以将以下内容添加到 conda-forge.yml

os_version:             # just to demo different values;
linux_64: cos7 # whenever possible, please use
linux_aarch64: alma8 # homogeneous distro versions
linux_ppc64le: alma9 # across platforms

conda-forge 中的 Linux 构建在源自 RHEL 及其克隆(以前是 CentOS,现在是 AlmaLinux)的基础设施上运行。 主要我们需要它用于四个不同的相互关联但又不同的部分

  • docker 镜像(包含将执行我们构建的操作系统)
  • sysroot(主要是 C 标准库,glibc
  • CDT(我们自己无法打包的发行版中的部分)
  • feedstock 对 yum_requirements.txt 的使用

第一个关键观察是 glibc 出现了两次——一次是在我们打包(并针对其编译!)的 sysroot 中显式出现,一次是在我们的 CI 运行的镜像中隐式出现。 这种设置对于默认提供高度兼容的软件包(通过针对 cos7 基线编译)至关重要,同时避免了 feedstock 的持续麻烦,在这些 feedstock 中,任何构建/主机/运行依赖项都需要比基线更新的 glibc。

这是因为,对于需要较新 c_stdlib_version 的软件包(因此通过 {{ stdlib("c") }} 基础设施针对较新的 sysroot 进行编译),将继承 __glibc >=c_stdlib_version 的运行时要求,这在运行时存在过旧 glibc 的 docker 镜像上将无法满足。

自 2021 年以来,我们已经有了这种设置(当时我们的 glibc 基线是来自 cos6 的 2.12,但我们已经使用了 cos7 镜像),但在将 glibc 基线提高到 2.17 后,我们的镜像再次失去了领先地位。 这主要与上述第三个组件 CDT(核心依赖树)有关。 这些代表发行版本身的软件包,我们很难或不可能提供,但需要一种系统的方法与之交互。 您可以在此处阅读更多关于为什么我们要尽可能避免它们的信息。

由于我们所知的 CentOS 的终结,无论如何我们已经不得不重写那里的许多逻辑以切换到 Alma,我们以此为契机,减少了我们未来提供的 CDT 集合。 在绝大多数情况下,我们为一些以前仅作为 CDT 提供的东西提供了常规 conda 软件包。

CDT 和 yum_requirements.txt 中的软件包密切相关;在许多方面,它可以被视为与我们的 sysroot(我们针对其编译)与运行时镜像中的 glibc 类似的编译与运行时分离。 这里的区别在于,CDT 是我们用来针对给定发行版软件包进行编译的东西,而 yum_requirements.txt 是我们告诉基础设施将它们安装到镜像中的方式,如果它们在运行时也是必需的(情况并非总是如此)。

换句话说,使用我们自己的软件包通常允许 feedstock 避免同时使用 CDT 和 yum_requirements.txt。 您可以查看我们移除的 CDT 此处,以及 yum_requirements.txt 如何从 CentOS 转换为 Alma(分别是我们自己的软件包)此处

镜像的更改可能意味着我们尚未为 Alma 重新打包的 CDT 不再与镜像中实际的内容匹配,或者——在极少数情况下——yum_requirements.txt 下的软件包名称需要更新。 如果您在那里遇到问题,请告知我们(在查看上面两个链接后,了解如何转换给定的软件包)。

最后,有一种罕见的情况,我们明确要求 feedstock 作者选择不使用最新的镜像:对于在 Linux 上进行二进制重新打包的任何 feedstock(即,不从源代码编译软件包),请确保您的镜像版本(如 conda-forge.yml 中指定,见上文)与您正在使用的 c_stdlib_version 匹配。 默认情况下,这是 2.17,这意味着您必须这样做

os_version:
linux_64: cos7
linux_aarch64: cos7
linux_ppc64le: cos7

如果您需要给定平台的 c_stdlib_version 为 2.28,则设置 alma8