使用Bazel 6.1.1编译Python应用时遇Workspace循环依赖错误
错误原因分析
- 未提前引入依赖仓库:WORKSPACE文件开头直接加载
@io_bazel_rules_docker的规则文件,但该仓库并未通过http_archive等命令被Bazel拉取和定义,导致Bazel无法找到该仓库,触发循环依赖检测错误。 - 资源定义顺序错误:
container_pull定义@python_container的语句放在了使用它的container_image之后,Bazel解析时会因找不到预定义的仓库而报错。
解决方案
1. 修正WORKSPACE文件
在文件最顶部添加http_archive引入io_bazel_rules_docker仓库,并调整语句顺序,确保先定义资源再使用:
# 引入与Bazel 6.1.1兼容的io_bazel_rules_docker版本 http_archive( name = "io_bazel_rules_docker", sha256 = "a9f7a68a693d56b3e8e5b32b4a88b04e35e5f8c4e16b2438a3d7a418c3b9f9d0", strip_prefix = "rules_docker-0.29.0", urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.29.0/rules_docker-v0.29.0.tar.gz"], ) # 加载并初始化容器相关仓库 load( "@io_bazel_rules_docker//repositories:repositories.bzl", container_repositories = "repositories", ) container_repositories() # 加载并初始化Python镜像相关仓库 load( "@io_bazel_rules_docker//python:image.bzl", _py_image_repos = "repositories", ) _py_image_repos() # 先定义python_container镜像,再在后续container_image中使用 container_pull( name = "python_container", registry = "docker.io/library", repository = "python", tag = "3.9-slim", ) # 加载容器相关规则 load("@io_bazel_rules_docker//container:container.bzl", "container_layer", "container_image") container_layer( name = "python_symlink", symlinks = { "/usr/bin/python": "/usr/local/bin/python", "/usr/bin/python3": "/usr/local/bin/python", }, ) container_image( name = "python", base = "@python_container//image", layers = [":python_symlink"], visibility = ["//visibility:public"], )
2. 优化BUILD文件(可选)
如果不需要自定义的@python//image镜像,可直接使用@python_container//image作为基础镜像,简化BUILD内容:
load("@io_bazel_rules_docker//python3:image.bzl", "py3_image") py3_image( name = "main", main = "main.py", srcs = ["main.py"], base = "@python_container//image", deps = [], )
3. 重新执行编译
运行以下命令重新编译项目:
bazel build //...
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

