如何使用 bazel rules_docker 中的 container_image 或 container_layer 为 empty_dir 定义所有者?

How can I define an owner to an empty_dir using container_image or container_layer from bazel rules_docker?

从实现 empty_dirs 的 PR 来看,似乎支持将目录所有者(使用名称参数)和模式定义到 TarFile add_empty_dir 方法中 class.

但是 container_image 规则(和 container_layer)仅支持模式。

这个有效:

container_image(
    name = "with_empty_dirs",
    empty_dirs = [
        "etc",
        "foo",
        "bar",
    ],
    mode = "0o777",
)

但是这个 returns 错误:“错误:(...) 'container_image_' 规则中没有这样的属性 'names'”:

container_image(
    name = "with_empty_dirs",
    empty_dirs = [
        "etc",
        "foo",
        "bar",
    ],
    names = "nginx",
)

如果我们想添加对 empty_dirs 所有者的支持,是否需要“write a customized container_image”?

在 BUILD 文件中,您要查找的属性是 ownername。有关详细信息,请参阅 pkg_tar reference documentation 文档。另外,我认为你不能直接将它传递给 container_image,你必须先创建一个单独的 pkg_tar。像这样:

pkg_tar(
    name = "with_empty_dirs_tar",
    empty_dirs = [
        "etc",
        "foo",
        "bar",
    ],
    ownername = "nginx.nginx",
)

container_image(
    name = "with_empty_dirs",
    tars = [":with_empty_dirs_tar"],
)

一般来说,container_image 有一个 pkg_tar 的子集作为直接属性来创建简单形式的添加文件,但对于复杂的用例,你应该自己创建一个 pkg_tar访问 adding/arranging 个文件的所有功能并设置其所有权。

您在 PR 中看到的 names 是 Python 辅助工具中的一个变量,BUILD 文件规则将其用作实现的一部分。您在 BUILD 文件中编写的内容与 Python 代码之间存在抽象层。