Flask+Celery+Docker Compose启动报错:'cached_property'无lock属性
AttributeError: 'cached_property' object has no attribute 'lock'错误(Flask+Celery+Docker场景) 问题背景
按照Flask+Celery多文件项目教程搭建环境,执行docker compose up时,Web服务和Celery服务均抛出AttributeError: 'cached_property' object has no attribute 'lock'错误,搜索技术社区后未找到有效解决方向。
报错根源
从报错栈可定位到问题出在kombu/utils/objects.py的__set__方法中:该代码尝试访问cached_property对象的lock属性,但Python 3.12移除了functools.cached_property的lock属性,而旧版本的Kombu(Celery的依赖库)未适配这个变更。
你的环境使用了Python 3.12(从报错路径/usr/local/lib/python3.12可确认),但教程发布于2023年1月,当时Python 3.12尚未发布,因此教程依赖的Celery/Kombu版本不兼容Python 3.12。
解决方案
方案1:降级Python版本(最稳妥,匹配教程环境)
修改项目的Dockerfile,将基础镜像从Python 3.12改为Python 3.11或更低版本,例如:
# 替换原有的python:3.12镜像 FROM python:3.11-slim # 后续构建步骤保持不变 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . .
修改后重新构建镜像并启动:
docker compose build docker compose up
方案2:升级Celery/Kombu到兼容Python 3.12的版本
更新项目的requirements.txt,指定支持Python 3.12的Celery和Kombu版本(Celery 5.3.0及以上版本已适配Python 3.12):
# 替换原有的Celery版本 celery>=5.3.0 flask>=2.2.0 redis>=4.5.0 # 其他依赖保持不变
重新构建镜像并启动,确保依赖更新到兼容版本。
方案3:临时补丁(仅应急测试,不推荐长期使用)
如果暂时无法修改版本,可以在容器内临时修改Kombu的代码:
- 进入运行中的容器(或构建时修改):
docker exec -it <容器ID> /bin/bash
- 编辑
/usr/local/lib/python3.12/site-packages/kombu/utils/objects.py,找到cached_property类的__set__方法,将:
with self.lock:
替换为:
# 移除lock相关代码,直接执行赋值 if instance is None: return self if self.name not in instance.__dict__: instance.__dict__[self.name] = value
这种方法仅临时生效,容器重启后会失效,仅适合快速验证问题。
内容的提问来源于stack exchange,提问作者Sat Lab

