Airflow镜像构建成功但docker-compose启动报错找不到urllib3.packages.six模块
问题根因
报错本质是第三方依赖版本冲突,和Airflow本身的配置错误没有关系:
- 你在Dockerfile最后一步无版本约束单独安装
urllib3时,pip默认拉取了已经不再兼容Python3.6的高版本urllib3。这类高版本urllib3已经移除了内置打包的six兼容模块,而当前环境中适配Python3.6的旧版requests包依然会从urllib3.packages.six路径导入依赖,最终触发ModuleNotFoundError报错。 - 日志中提示的Airflow日志处理器
file_task_handler导入失败,只是上述导入错误触发的连锁反应,不是问题的根源。
排查与修复步骤
1. 先定位容器内的实际版本错配
在启动失败的容器内执行以下命令,确认依赖版本状态:
pip3 list | grep -E "urllib3|requests|six"
正常会匹配到两类错配特征:
- 安装的urllib3版本大于
1.25.11(该版本之后urllib3停止内置six模块,且后续版本逐步放弃对Python3.6的支持) - 安装的requests版本为
2.26.0及以下,依然依赖urllib3内置的six导入路径
2. 调整Dockerfile的依赖安装逻辑
按照以下规则修改安装命令,从根源解决版本冲突:
- 删掉原Dockerfile中最后一行无版本约束的独立urllib3安装命令。Airflow本身的依赖解析逻辑会自动安装适配当前运行环境的urllib3版本,手动在主依赖安装完成后覆盖安装核心网络库,非常容易打乱原有版本匹配关系。
- 如果确实需要自定义urllib3、requests版本,必须锁定适配Python3.6的兼容版本:
- 安装
urllib3==1.26.18,这是最后一个支持Python3.6的urllib3版本,内置完整的six兼容路径,不会触发导入错误 - 配套安装
requests==2.27.1,和上述urllib3版本的导入逻辑完全匹配
- 安装
- 调整安装顺序:把urllib3、requests的安装步骤放到Airflow主依赖安装之前,避免后续安装的其他依赖把版本覆盖成不兼容的错配版本。安装完成后加一步依赖完整性校验:
提前发现版本错配问题,不要等到容器启动时才暴露导入报错。pip3 check
3. 清理缓存后重新构建镜像
由于之前的构建层已经缓存了错配的依赖版本,重新构建时需要跳过本地缓存,避免旧的错配依赖残留在新镜像中:
docker-compose build --no-cache
常见坑点提醒
- 当前环境使用的Python3.6已经正式停止维护,后续所有通过pip安装的第三方包,都必须手动锁定最后一个支持Python3.6的版本,不能使用不带版本号的安装命令,pip默认拉取的最新版本几乎都已经放弃对Python3.6的兼容。
- urllib3、requests这类核心网络库是Airflow、Celery、各类数据库驱动、API客户端的公共依赖,不要在主依赖安装完成后单独覆盖安装这类包,否则会触发跨组件的连锁导入错误,排查成本极高。
内容的提问来源于stack exchange,提问作者cluis92
相关产品推荐
相关产品推荐

