新闻详情

新闻详情

首页 / 资讯中心 / 详情

BentoML Container APIs 实战指南:用 Python SDK 构建 OCI 兼容镜像

发布时间:2026/9/25 6:03:15来源:尧图网络
BentoML Container APIs 实战指南:用 Python SDK 构建 OCI 兼容镜像
模型推理服务人工智能后端大模型MLOpsLLMOps【免费下载链接】BentoMLThe easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!项目地址https://gitcode.com/gh_mirrors/be/BentoML点击查看免费下载本篇指南围绕 BentoML 的容器化 Python SDK即bentoml.container模块展开系统讲解如何把任意一个已构建的 Bento 打包为 OCI 兼容镜像包括核心构建入口bentoml.container.build、后端健康检查与查询health/get_backend、自定义后端注册register_backend以及辅助生成 Containerfile 的get_containerfile工具函数。读完本文你将掌握在代码中直接驱动 Docker、Podman、Buildah、nerdctl、buildctl、buildx 六类 OCI 构建器并能结合 BentoML 的 Dockerfile 模板生成机制理解镜像的构建原理。一、Container APIs 是什么面向 Python 的镜像构建入口BentoML 的容器化能力长期以 CLI 命令bentoml containerize的形式对外提供而其底层的 Python SDK 则集中在bentoml.container模块。该模块被官方文档收录于 docs/source/reference/bentoml/container.rst公开了五个核心成员__all__定义见 src/bentoml/container.pybentoml.container.build将指定 Bento 构建为 OCI 兼容镜像bentoml.container.health检查指定构建后端是否可用bentoml.container.get_backend从后端注册表中获取某个构建器实例bentoml.container.register_backend注册自定义构建后端bentoml.container.get_containerfile生成并导出容器文件Containerfile / Dockerfile。模块 docstring 将其定位为 User facing python APIs for building a OCI-complicant imagesrc/bentoml/container.py即所有 API 的目标都是产出一个符合 OCI 规范的容器镜像。CLI 层只是这层 Python API 的薄封装——bentoml_cli/containerize.py中的containerize_command最终同样调用container.build(...)src/bentoml_cli/containerize.py。二、bentoml.container.build核心构建入口build是整个容器化 SDK 的主入口签名核心参数如下实现见 src/bentoml/container.py参数类型说明bento_tagTag \| str目标 Bento 的标签格式为NAME:VERSION例如pytorch_vgg:latestbackendstr使用的构建后端默认docker支持docker、podman、buildah、nerdctl、buildctl、buildximage_tagtuple[str]额外指定的镜像标签缺省时由determine_container_tag依据 Bento 标签自动生成src/bentoml/_internal/container/init.pyfeaturesSequence[str]需要额外安装进镜像的 BentoML 可选特性例如[grpc, tracing]**kwargsAny透传给所选后端构建器的其余参数如add_host、build_arg、cache_from、label、secret、no_cache等官方示例来自函数 docstringsrc/bentoml/container.pyimport bentoml bento bentoml.get(pytorch_vgg:latest) bentoml.container.build(bento, backendpodman, features[grpc, tracing])build的执行流程见 src/bentoml/container.py 与 src/bentoml/_internal/container/init.py先调用health(backend)对后端做健康检查不健康时直接抛出BentoMLException(Backend %s is not healthy.)若未显式传入tag用determine_container_tag依据bento_tag推导默认镜像标签从BentoStore中取出目标 Bento调用内部实现_internal_build先通过construct_containerfile在临时目录中重建构建上下文并生成最终 Dockerfile再调用所选后端构建器执行实际构建命令。注意参数backend的取值会通过t.overload对不同类型的后端做静态类型约束。例如backendbuildx时可用的 kwargs 是attest、cache_to、provenance、sbom、push、load等 buildx 专属参数而backenddocker时则是isolation、iidfile、network、quiet、target等。完整重载声明见 src/bentoml/container.py。2.1 features 参数镜像内预装 BentoML 可选依赖features允许在构建阶段向镜像追加 BentoML 的可选依赖安装指令。可用取值由常量FEATURES约束定义在 src/bentoml/_internal/container/init.pyFEATURES frozenset({ tracing, grpc, grpc-reflection, grpc-channelz, monitor-otlp, triton, aws, all, io, io-file, io-image, io-pandas, io-json, tracing-zipkin, tracing-jaeger, tracing-otlp, })若传入不在集合内的值construct_containerfile会抛出InvalidArgument提示可用特性与非法字段src/bentoml/_internal/container/init.py。在启用 BuildKit 时生成的指令会带上 pip 缓存挂载以加速构建RUN --mounttypecache,target/root/.cache/pip pip install bentoml[grpc,tracing]2.2 kwargs 与后端的对应关系build的**kwargs会被各后端模块的construct_build_args转换为真实的命令行参数。以docker后端为例src/bentoml/_internal/container/docker.pyadd_host、build_arg、cache_from、label、output、secret均支持dict或元组两种形式dict 会被展开为keyvalue形式后以--opt前缀拼接未识别参数则统一按k.replace(_, -)转成连字符命名再拼接。例如传入build_arg{FOO: BAR}等价于命令行--build-arg FOOBAR。三、后端体系六种 OCI 构建器与健康检查BentoML 在后端设计上是backend-agnostic见 src/bentoml_cli/containerize.py任何符合 OCI 规范的构建器都可以接入。模块启动时通过register_default_backends()自动注册六个默认后端src/bentoml/_internal/container/init.py后端健康检查要点BuildKit 支持docker二进制存在于 PATH且服务端版本 ≥ 18.09BuildKit 要求是ENV默认DOCKER_BUILDKIT1buildx依赖 docker 健康且docker buildx --help输出含--builder string是构建命令为buildx buildpodman二进制存在macOS/Windows 上额外校验 podman machine 处于运行态否buildah二进制存在默认BUILDAH_FORMAToci、DOCKER_BUILDKIT0否nerdctl二进制存在是buildctl要求buildkitd可用或设置了BUILDKIT_HOST且不支持 Windows是各后端健康检查实现分别位于 docker.py、buildx.py、podman.py、buildah.py、buildctl.py。关于 BuildKit还有两个值得注意的实现细节环境变量DOCKER_BUILDKIT优先enable_buildkit()会先读环境变量未设置时才回退到各后端声明的默认值src/bentoml/_internal/container/init.pybuildctl 后端在未找到buildkitd时会提示用户用docker run -d --name buildkitd --privileged moby/buildkit:master启动便携版 buildkitd并设置BUILDKIT_HOSTsrc/bentoml/_internal/container/buildctl.py。3.1 health构建前的一线体检from bentoml.container import health assert health(docker) # 返回 bool assert health(podman)health(backend)是get_backend(backend).health()的便捷封装src/bentoml/_internal/container/init.py。文档特别提示如果传入的 backend 属于自定义类型且尚未注册请先调用register_backend完成注册。containerizeCLI 也会在真正构建前先行执行一次健康检查以尽早失败src/bentoml_cli/containerize.py。3.2 get_backend获取构建器实例from bentoml.container import get_backend builder get_backend(docker) print(builder) # OCIBuilder (binary/usr/bin/docker, enable_buildkitTrue)get_backend从模块级注册表BUILDER_REGISTRY中按名称取出OCIBuilder实例src/bentoml/_internal/container/init.py若传入的 backend 未注册抛出ValueError并在报错信息中列出全部已注册后端REGISTERED_BACKENDS若传入对象本身是OCIBuilder但不在注册表中会打印警告日志提示使用前需先注册。OCIBuilder是构建器的抽象基类src/bentoml/_internal/container/base.py它承载了binary可执行文件路径、env默认环境变量、build_cmd构建子命令例如 buildx 的[buildx, build]、enable_buildkit等属性。它不能被直接实例化_internalFalse时抛出BentoMLException只能通过注册机制间接创建。四、register_backend注册自定义构建后端register_backend允许把任意的 OCI 构建器接入 BentoML签名如下src/bentoml/_internal/container/init.pydef register_backend( backend: str, *, buildkit_support: bool, health: Callable[[], bool], construct_build_args: Callable[..., Arguments], binary: str | None None, build_cmd: Sequence[str] | None None, env: dict[str, str] | None None, ):参数含义backend后端名称例如limabuildkit_support是否支持 BuildKithealth健康检查回调无参返回boolconstruct_build_args将后端 kwargs 转换为命令行参数列表的回调env构建时注入的默认环境变量binary可执行文件路径缺省取后端名称需保证其在PATH中build_cmd构建子命令缺省为[build]文档给出了用 lima 作为示例的注册代码src/bentoml/_internal/container/init.pyimport shutil from bentoml.container import register_backend register_backend( lima, binaryshutil.which(limactl), buildkit_supportTrue, healthbuildx_health, construct_build_argsbuildx_build_args, env{DOCKER_BUILDKIT: 1}, )注册时有两点约束同名后端重复注册会抛ValueErrorBackend ... already registered.register_backend内部通过OCIBuilder.create创建FrozenOCIBuilder实例将health与construct_build_args冻结为具体实现src/bentoml/_internal/container/base.py。注册完成后build、health、get_backend即可按新后端名正常工作。五、Utility 函数get_containerfile 导出容器文件文档将get_containerfile单独归入 Utility functions 一节用于帮助用户定制容器化流程。其签名与行为src/bentoml/container.pydef get_containerfile( bento_tag: Tag | str, output_path: str | None None, enable_buildkit: bool True, features: Sequence[str] | None None, ):行为要点输出位置output_path缺省时生成的 Containerfile 内容直接打印到sys.stderr提供路径时写入该文件目录语义如果output_path是一个目录实际写入路径为output_path os.sep bento_tag.dockerfilebento 标签中的分隔符会替换为下划线与 Bento 内置 Dockerfile 的区别文档明确指出Bento 内自带的 Dockerfile 是最小化的而此函数返回的是bentoml containerize实际会使用的完整 Containerfilesrc/bentoml/container.pyBuildKit 开关enable_buildkit决定生成的 Containerfile 是否包含 BuildKit 语法如# syntax指令与缓存挂载。典型用法import bentoml # 打印到 stderr bentoml.container.get_containerfile(iris_classifier:latest) # 写入文件 bentoml.container.get_containerfile(iris_classifier:latest, output_path./Containerfile)5.1 底层实现construct_containerfile 的完整重建逻辑get_containerfile实际调用的是内部上下文管理器construct_containerfilesrc/bentoml/_internal/container/init.py其执行流程值得展开读取 Bento 元数据bento.yaml解析出DockerOptions、CondaOptions与模型清单将 Bento 内容整体复制到临时目录作为新的构建上下文按模型注册来源huggingface或普通 Bento 模型分别解析模型引用到models/与hf-models/目录依据镜像配置选择 Dockerfile 模板并渲染详见下一节写入env/docker/Dockerfile若指定了features在 Dockerfile 后追加pip install bentoml[...]指令。build会复用同一套construct_containerfile并在其后把生成的 Dockerfile 路径与临时上下文传给后端构建器执行src/bentoml/_internal/container/init.py。5.2 Dockerfile 模板选择机制Containerfile 的渲染由generate_containerfile完成src/bentoml/_internal/container/generate.py。模板文件位于 src/bentoml/_internal/container/frontend/dockerfile/templates/按release_type_distro.j2命名组织发布类型适用场景模板示例base用户指定了自定义base_imagebase.j2python纯 Python 运行时python_debian.j2、python_alpine.j2、python_ubi8.j2、python_amazonlinux.j2miniconda启用了 Conda 环境miniconda_debian.j2、miniconda_alpine.j2cuda指定了cuda_versioncuda_debian.j2、cuda_ubi8.j2选择逻辑为cuda_version非空 →cuda否则 Conda 非空 →miniconda否则 →python若用户配置了base_image则一律退化为base.j2。所有模板共享 SETUP_BENTO_BASE_IMAGE / SETUP_BENTO_USER / SETUP_BENTO_ENVARS / SETUP_BENTO_COMPONENTS / SETUP_BENTO_ENTRYPOINT 等构建块并可通过bento__uid_gid、bento__user、bento__home、bento__path、bento__enable_buildkit等变量覆盖src/bentoml/_internal/container/generate.py。相关的镜像配置项定义在DockerOptionssrc/bentoml/_internal/bento/build_config.py可在 bentofile.yaml 中配置distro仅限受支持发行版、python_version、cuda_version、env、system_packages、setup_script、base_image、dockerfile_template。若同时配置base_image与distro/python_version/cuda_version/system_packages后者会被忽略并给出警告日志。六、与 bentoml containerize CLI 的关系bentoml containerize是上述 Python API 的命令行等价物。核心选项与 Python 参数一一对应src/bentoml_cli/containerize.pybentoml containerize iris_classifier:latest -t repo-address.com:username/iris构建镜像并携带自定义仓库地址等价image_tag--backend选择构建后端默认docker也支持环境变量BENTOML_CONTAINERIZE_BACKEND指定--enable-features等价features可用值即上文FEATURES集合--opt统一的后端透传参数入口。布尔开关如--opt no-cache、键值对如--opt build-argFOOBAR、单值参数如--opt cgroup-parentcgroupv2三种写法均支持--run-as-root以 root 身份运行后端构建命令DOCKER_BUILDKIT0 bentoml containerize iris_classifier:latest显式关闭 BuildKit。CLI 与 Python API 的差异在于CLI 需要把--opt解析结果经opt_callback转换后再透传给container.build并会依据后端与调试模式自动调整progress参数src/bentoml_cli/containerize.py。此外bentoml build --containerize是构建 Bento 后立即容器化的快捷方式同样落到底层bentoml.container.build(bento.tag, backendbackend)调用src/bentoml_cli/bentos.py。七、完整实战示例下面用一个完整的示例串起本文的全部 APIimport bentoml from bentoml.container import build, health, get_backend, register_backend, get_containerfile # 1. 构建前的健康检查 assert health(docker), Docker 后端不可用 # 2. 查询默认后端实例 builder get_backend(docker) print(builder) # 3. 导出 containerize 实际使用的 Containerfile 到文件 get_containerfile(iris_classifier:latest, output_path./Containerfile) # 4. 直接构建镜像docker 后端 grpc/tracing 特性 自定义镜像标签 build( iris_classifier:latest, backenddocker, image_tag(myrepo/iris:1.0.0,), features[grpc, tracing], build_arg{PIP_INDEX_URL: https://pypi.org/simple}, label{maintainer: ml-platform}, no_cacheTrue, ) # 5. 可选注册自定义后端后按新名称构建 # register_backend(lima, binary..., buildkit_supportTrue, # health..., construct_build_args...) # build(iris_classifier:latest, backendlima)八、关键源码索引面向用户的 API 封装src/bentoml/container.py后端注册表与构建编排src/bentoml/_internal/container/init.pyOCIBuilder 抽象基类与命令构造src/bentoml/_internal/container/base.py六个后端实现docker.py、buildx.py、podman.py、buildah.py、nerdctl.py、buildctl.pyDockerfile 渲染与模板变量src/bentoml/_internal/container/generate.pyDockerfile 模板目录src/bentoml/_internal/container/frontend/dockerfile/templates/镜像配置模型DockerOptionssrc/bentoml/_internal/bento/build_config.pyCLI 封装src/bentoml_cli/containerize.py综上所述BentoML 的 Container APIs 是一套CLI 之下、构建器之上的薄而完整的 Python 层build负责把 Bento 与模型解析成构建上下文并驱动任意 OCI 构建器health/get_backend/register_backend提供后端生命周期管理get_containerfile则为深度定制容器化流程如修改生成的 Dockerfile 后再自行构建提供了抓手。理解这五个 API即可在自动化流水线中完全脱离 CLI以纯 Python 方式完成模型的镜像化交付。赞分享模型推理服务人工智能后端大模型MLOpsLLMOps【免费下载链接】BentoMLThe easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!项目地址https://gitcode.com/gh_mirrors/be/BentoML点击查看免费下载相关推荐使用 GoReleaser 与 ko 构建 OCI 兼容容器镜像的完整实战指南使用 GoReleaser 与 ko 构建 OCI 兼容容器镜像的完整实战指南 本文基于 www/content/blog/goreleaser ko.md h开发工具CI/CD构建工具Buildah 演示脚本实战指南从 scratch 构建 OCI 镜像、Docker 兼容与 Dockerfile 构建Buildah 演示脚本实战指南从 scratch 构建 OCI 镜像、Docker 兼容与 Dockerfile 构建 本文基于 Buildah 仓库中 d云原生mise oci build 实战从 mise.toml 一键构建可复用的 OCI 容器镜像mise oci build 实战从 mise.toml 一键构建可复用的 OCI 容器镜像 mise oci build 是 misevfox 迁移前的开发工具CLI上一篇ExpressCart扩展开发如何编写自定义模块增强功能下一篇深入探索AMD Ryzen硬件调试工具的技术实现与应用实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ES8311音频Codec时钟树配置与分频计算完全指南 2026/9/25 6:30:59

ES8311音频Codec时钟树配置与分频计算完全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从幺蓝破解官网案例拆解软件分发与版本管理技术实践 2026/9/25 6:30:59

从幺蓝破解官网案例拆解软件分发与版本管理技术实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
嵌入式C语言手搓UTF-8编解码与工具函数实战 2026/9/25 6:30:59

嵌入式C语言手搓UTF-8编解码与工具函数实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
一阶数字低通滤波器参数选择:α系数推导与工程实践 2026/9/25 6:30:53

一阶数字低通滤波器参数选择:α系数推导与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ESP32上WASM无法直接调用硬件的三大根本原因 2026/9/25 6:30:53

ESP32上WASM无法直接调用硬件的三大根本原因

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
如何用treg做AI搜索?Tavily、Exa等搜索API在Agent中的终极用法 2026/9/25 6:30:53

如何用treg做AI搜索?Tavily、Exa等搜索API在Agent中的终极用法

如何用treg做AI搜索?Tavily、Exa等搜索API在Agent中的终极用法 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg treg(开源的&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉