如何用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
相关产品推荐
相关产品推荐

