如何使用 bazel 拉取基于架构的图像

how to pull image based on architecture with bazel

我是 运行 bazel,正在使用 rules_docker 的规则 container_pull。 container_pull 具有体系结构属性。 在 CI 和一些开发机器中,架构是 amd。 在新的 m1 macs 中,架构是 arm。

我如何配置 bazel 在 amd 机器上拉 amd,在 arm 机器上拉 arm?

最简单的方法是使用两个 container_pull 规则和 select。在你的 WORKSPACE:

container_pull(
    name = "thing_amd",
    architecture = "amd64",
    <same stuff you have now>
)

container_pull(
    name = "thing_arm",
    architecture = "arm",
    <same stuff you have now>
)

然后在某些 BUILD 文件中:


config_setting(
    name = "k8",
    constraint_values = ["@platforms//cpu:x86_64"],
)

config_setting(
    name = "arm",
    constraint_values = ["@platforms//cpu:arm"],
)

alias(
    name = "thing",
    actual = select({
        ":k8": "@thing_amd//image",
        ":arm": "@thing_arm//image",
    }),
)

如果您想删除重复数据(尤其是当您有两个以上的 CPU 时),macros 很有帮助。创建一个包含所有 CPU 的 .bzl 文件,然后创建一个宏来创建所有 container_pull 存储库(从 WORKSPACE 加载+调用)和另一个宏来创建 config_settings 和您从 BUILD 文件加载+调用的 alias