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_image
,base
设置为导入的图像,tars
设置为您要添加的其他文件。或者,如果您想添加其他格式的内容,请参阅 tars
的替代文档(例如 debs
或 files
)。
把它们放在一起,在你的 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
。
我知道在 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_image
,base
设置为导入的图像,tars
设置为您要添加的其他文件。或者,如果您想添加其他格式的内容,请参阅 tars
的替代文档(例如 debs
或 files
)。
把它们放在一起,在你的 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
。