使用AWS CodePipeline部署时遭遇'urllib3.packages'模块未找到错误
问题排查与解决建议
核心原因分析
- urllib3内部模块变更:urllib3从v2.0版本开始,移除了
urllib3.packages这个内部私有模块,不再允许外部代码直接导入该路径下的内容。你当前安装的urllib3大概率是高版本,导致urllib3.packages不存在。 - 冗余且错误的导入语句:代码里从
urllib3.packages导入six完全没必要——six已经是requirements.txt中单独声明的依赖包,直接导入six即可;另外from .packages.six import ...是相对导入,你的项目结构中并没有packages子目录,这也是错误的。 - requirements.txt版本号不合法:文件中
Flask-WTF==1.2.、flask-cors==4.0.的版本号格式错误(末尾缺少数字),会导致pip安装时出现不可预期的版本选择或安装失败。 - Dockerfile中依赖安装逻辑混乱:反复执行
pip3 uninstall urllib3、多次升级urllib3的操作会导致依赖版本不稳定,且部分依赖(如flask、flask-cors)在requirements.txt中已经声明,无需单独安装。
具体修复步骤
1. 修正Python代码中的导入语句
修改mythicalMysfitsService.py的导入部分,替换错误的导入:
from flask import Flask, jsonify, json, Response, request from flask_cors import CORS # 直接导入six,不需要从urllib3.packages导入 import six # 如果需要HTTPConnection和HTTPException,直接从six.moves.http_client导入 from six.moves.http_client import HTTPConnection as _HTTPConnection, HTTPException import mysfitsTableClient
注:
six库已经封装了Python2/Python3的兼容层,HTTPConnection和HTTPException可以直接从six.moves.http_client获取,无需依赖urllib3的内部模块。
2. 修复requirements.txt的版本号问题
修正文件中不合法的版本号,同时限制urllib3版本(如果需要兼容旧逻辑):
boto3>=1.11.16 Werkzeug==2.3.0 Flask==2.3.0 Flask-Bcrypt==1.0.1 Flask-Login==0.6.2 Flask-SQLAlchemy==3.1.1 # 修正Flask-WTF的版本号为合法格式 Flask-WTF==1.2.1 # 修正flask-cors的版本号为合法格式 flask-cors==4.0.0 requests six # 指定urllib3的兼容版本(保留packages模块的最后大版本) urllib3<2.0
3. 简化Dockerfile的依赖安装逻辑
删除冗余的依赖安装命令,确保依赖安装顺序合理:
FROM ubuntu:latest ENV PIP_BREAK_SYSTEM_PACKAGES 1 # 安装系统依赖并清理缓存 RUN apt-get update -y && apt-get install -y python3 python3-pip python3-dev build-essential && rm -rf /var/lib/apt/lists/* # 复制应用文件并设置工作目录 COPY ./service /MythicalMysfitsService WORKDIR /MythicalMysfitsService # 升级pip并统一安装依赖 RUN pip3 install --upgrade pip && pip3 install -r ./requirements.txt ENTRYPOINT ["python3"] CMD ["mythicalMysfitsService.py"]
优化点:
- 合并系统依赖安装命令,减少镜像分层
- 先升级pip再安装依赖,避免版本兼容问题
- 删除单独安装flask、flask-cors、boto3的命令,统一通过requirements.txt管理
- 删除冗余的urllib3卸载/重装操作
4. 验证部署环境的依赖一致性
在本地构建镜像并测试,确保依赖安装正确:
# 构建镜像 docker build -t mythical-mysfits . # 运行容器测试 docker run -p 8080:8080 mythical-mysfits
如果本地测试正常,再推送镜像到AWS容器服务(如ECR),然后重新触发CodePipeline部署。
内容的提问来源于stack exchange,提问作者Retrospect
相关产品推荐
相关产品推荐

