Bazel:如何扩展现有的 docker 图像?

Bazel: How to extend existing docker image?

我知道在 Dockerfile 中我可以扩展现有的 docker 图像使用:

FROM python/python
RUN pip install request

但是如何在 bazel 中扩展它呢?

我不确定是否应该使用 container_import,但我收到以下错误:

container_import(
    name = "postgres",
    base_image_registry = "some.artifactory.com",
    base_image_repository = "/existing-image:v1.5.0",
    layers = [
        "//docker/new_layer",
    ],
)
root@ba5cc0a3f0b7:/tcx# bazel build pkg:postgres-instance --verbose_failures --sandbox_debug
ERROR: /tcx/docker/postgres-operator/BUILD.bazel:12:17: in container_import rule //docker/postgres-operator:postgres:
Traceback (most recent call last):
    File "/root/.cache/bazel/_bazel_root/2f47bbce04529f9da11bfed0fc51707c/external/io_bazel_rules_docker/container/import.bzl", line 98, column 35, in _container_import_impl
        "config": ctx.files.config[0],
Error: index out of range (index is 0, but sequence has 0 elements)
ERROR: Analysis of target '//pkg:postgres-instance' failed; build aborted: Analysis of target '//docker/postgres-operator:postgres' failed
INFO: Elapsed time: 0.209s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (1 packages loaded, 2 targets configured)

container_import 是导入现有图像的正确规则。但是,它所做的只是导入,不会从任何地方提取。我认为您正在寻找 container_pull,它将从存储库中提取图像,然后自动使用 container_import 将其转换为其他 rules_docker 规则。

要添加新层,请使用 container_imagebase 设置为导入的图像,tars 设置为您要添加的其他文件。或者,如果您想添加其他格式的内容,请参阅 tars 的替代文档(例如 debsfiles)。

把它们放在一起,在你的 WORKSPACE:

中是这样的
container_pull(
  name = "postgres",
  registry = "some.artifactory.com",
  repository = "existing-image",
  tag = "v1.5.0",
)

然后在 BUILD 文件中:

container_image(
  name = "postgres_plus",
  base = "@postgres//image",
  tars = ["//docker/new_layer"],
)

您 运行 遇到的具体问题是 container_pull.layers 不是用于添加新图层,而是用于指定您正在导入的图像的图层。您可以通过其他方式导入它们(http_archive、签入 tar 文件等),然后手动指定它们,而不是在您做一些不寻常的事情时使用 container_pull