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

如何用Bazel构建pip包Tar包作为OCI镜像层(低自定义代码)

用Bazel将pip包打包为镜像层(最少自定义代码)

不需要自定义pip_source_list规则,直接利用rules_python生成的pip依赖target即可获取包文件,结合rules_pkg和rules_oci就能实现需求,步骤如下:

1. 基础配置(WORKSPACE)

确保已引入所需规则(若未配置):

# 引入rules_python
http_archive(
    name = "rules_python",
    sha256 = "f8a63f30a4648e9e5f1cf3e44467f0979b637d5b3ff9b35365a5d9e0ed956d75",
    url = "https://github.com/bazelbuild/rules_python/releases/download/0.25.0/rules_python-0.25.0.tar.gz",
)

load("@rules_python//python:repositories.bzl", "python_register_toolchains")
python_register_toolchains(
    name = "python3_11",
    python_version = "3.11",
)

# 生成pip依赖
load("@rules_python//python:pip.bzl", "pip_install")
pip_install(
    name = "pip-deps",
    requirements = "//:requirements.txt",
)

# 引入rules_pkg
http_archive(
    name = "rules_pkg",
    sha256 = "c271c7f51f1099b5f14f85143f120e6e43f957d7ae414088e57f35b40e52f1b0",
    url = "https://github.com/bazelbuild/rules_pkg/releases/download/0.10.1/rules_pkg-0.10.1.tar.gz",
)

# 引入rules_oci
http_archive(
    name = "rules_oci",
    sha256 = "a1a474f4d703c2f4a63a18b43d6f944e3a8a772d5047514c457206a48e084c11",
    url = "https://github.com/bazel-contrib/rules_oci/releases/download/v0.6.0/rules_oci-v0.6.0.tar.gz",
)
load("@rules_oci//oci:deps.bzl", "oci_deps")
oci_deps()

2. 打包pip包为Tar层(BUILD文件)

直接使用rules_python生成的requirement target,结合pkg_tar打包,再用rules_oci构建镜像:

load("@pip-deps//:requirements.bzl", "requirement")
load("@rules_pkg//pkg:tar.bzl", "pkg_tar")
load("@rules_oci//oci:defs.bzl", "oci_image", "oci_tarball")

# 打包numpy为tar层,指定解压后路径为site-packages
pkg_tar(
    name = "numpy_tar",
    srcs = [requirement("numpy")],
    package_dir = "site-packages",
    mode = "0644",
)

# 构建基础镜像并添加numpy层
oci_image(
    name = "my_image",
    base = "docker.io/python:3.11-slim",
    layers = [":numpy_tar"],
    entrypoint = ["python"],
)

# 导出为本地Docker镜像tar包(可选)
oci_tarball(
    name = "my_image_tar",
    image = ":my_image",
    repo_tags = ["my-image:latest"],
)

关键说明

  • requirement("numpy")直接指向rules_python生成的包含numpy所有文件的target,无需自定义规则获取文件列表。
  • package_dir = "site-packages"确保tar包解压后,pip包文件会放到Python的site-packages目录,保证镜像中Python能正常导入。
  • 若需打包多个pip包,可在pkg_tar的srcs里添加多个requirement(),或拆分多个pkg_tar做成独立镜像层(利于缓存)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:43:16