如何使用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"即可 }, )
使用方法
- 执行构建命令:
bazel build //<你的包路径>:debian10_slim - 导入到本地Docker:
docker load -i bazel-bin/<你的包路径>/debian10_slim.tar - 运行测试:
docker run --rm -it local/debian10:slim
注意事项
如果需要保留原Debian镜像的默认环境变量、工作目录、entrypoint等配置,可以先手动导出原镜像的对应参数,填入container_import的对应配置项中,避免运行时出现异常。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

