You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Bazel rules_docker的container_flatten创建可运行Docker镜像

报错原因

container_flatten 规则的输出是单层根文件系统tar包,仅包含镜像的文件系统内容,不是符合Docker/OCI规范的带manifest元数据的完整镜像包,因此直接作为 container_image 的 base 参数传入时会找不到manifest.json抛出报错。

正确实现步骤

你需要使用container_import规则先将扁平化的文件系统tar导入为rules_docker可识别的基础镜像,再基于该镜像打包为可运行的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",
)

# 预构建未扁平化的瘦身镜像
container_image(
  name = "debian10_slimmed_image",
  base = ":debian10_slimmed_layers",
)

# 扁平化得到单层文件系统tar
container_flatten(
    name = "debian10_flatten",
    image = ":debian10_slimmed_image",
)

# 关键步骤:将单层文件系统tar导入为标准容器基础镜像
container_import(
    name = "debian10_flatten_base",
    tarball = ":debian10_flatten",
    # 对齐原版Debian 10的默认配置,可根据实际需求修改
    cmd = ["bash"],
    os = "linux",
    architecture = "amd64",
)

# 可选步骤:如果需要额外添加文件、配置环境变量等,可以基于导入的基础镜像二次构建
container_image(
  name = "debian10_custom",
  base = ":debian10_flatten_base",
  # 此处可添加files、env、entrypoint等自定义配置
)

# 打包为可直接被docker load识别的完整镜像包
container_bundle(
    name = "debian10_slim",
    images = {
        # 自行修改为你需要的镜像名和标签
        "local/debian10:slim": ":debian10_flatten_base",
        # 如果使用了上面的自定义镜像,替换为":debian10_custom"即可
    },
)
使用方法
  1. 执行构建命令:bazel build //<你的包路径>:debian10_slim
  2. 导入到本地Docker:docker load -i bazel-bin/<你的包路径>/debian10_slim.tar
  3. 运行测试:docker run --rm -it local/debian10:slim
注意事项

如果需要保留原Debian镜像的默认环境变量、工作目录、entrypoint等配置,可以先手动导出原镜像的对应参数,填入container_import的对应配置项中,避免运行时出现异常。


内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 07:54:06