首页 > 解决方案 > 如何使用 Bazel rules_docker container_flatten 创建 Docker 镜像?

问题描述

我想使用 Bazel 精简 debian 10 Docker 映像,然后将结果展平为单层映像。

这是我的代码:

load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_flatten", "container_bundle", "container_import")
load("@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_commit")


container_run_and_commit(
  name = "debian10_slimmed_layers",
  commands = ["rm -rf /usr/share/man/*"],
  image = "@debian10//image",
)

# Create an image just so we can flatten it.
container_image(
  name = "debian10_slimmed_image",
  base = ":debian10_slimmed_layers",
)

# Flatten the layers to a single layer.
container_flatten(
    name = "debian10_flatten",
    image = ":debian10_slimmed_image",
)

我陷入困境的地方是我无法弄清楚如何使用 的输出debian10_flatten来生成可运行的 Docker 映像。

我试过:

container_image(
  name = "debian10",
  base = ":debian10_flatten",
)

那失败了:

2021/06/27 13:16:25 Unable to load docker image from bazel-out/k8-fastbuild/bin/debian10_flatten.tar:
file manifest.json not found in tar

标签: dockerbazelbazel-rules

解决方案


container_flatten为您提供文件系统压缩包。您需要添加 tarball tarsdebian10而不是deps

container_image(
  name = "debian10",
  tars = [":debian10_flatten.tar"],
)

deps是针对另一个container_image规则(或等效规则)。如果你有一个docker save-style tarball,container_load将是获得container_image等价物的方法。

我在查看container/flatten.bzl中的实现时发现了这一点。如果有人想打开 PR(它们是从 .bzl 文件中的 python 样式的文档字符串生成的),文档肯定可以使用一些改进。


推荐阅读