Docker容器运行Python Lambda项目提示找不到api_utils模块如何解决
问题原因
- Python模块搜索路径不匹配:Python导入模块时会优先从
sys.path记录的路径中查找目标模块,你运行./alpha-api/app.py时,Python默认仅将脚本所在的${LAMBDA_TASK_ROOT}/alpha-api目录加入搜索路径,而api_utils目录存放在上层的${LAMBDA_TASK_ROOT}根目录下,不在搜索路径范围内,因此无法被识别。 - 依赖安装配置不合理:Dockerfile中
pip install添加了--target ./alpha-api参数,会将所有第三方依赖安装到alpha-api子目录下,不符合多Lambda函数共用仓库的架构设计,也可能引发后续其他路径调用依赖的问题。
解决方案
你可以根据自己的场景选择以下任意一种方案解决:
方案1:配置PYTHONPATH环境变量(最便捷,无需修改业务代码)
修改Dockerfile,将项目根目录加入Python模块搜索路径即可,修改后的Dockerfile参考如下:
FROM public.ecr.aws/lambda/python:3.8 COPY . ${LAMBDA_TASK_ROOT} WORKDIR ${LAMBDA_TASK_ROOT} # 将项目根目录加入Python模块搜索路径 ENV PYTHONPATH=${LAMBDA_TASK_ROOT} # 移除原有--target参数,依赖默认安装到系统Python路径,所有层级脚本都可调用 RUN pip install -r ./alpha-api/requirements.txt
修改后重新构建镜像即可正常运行。
方案2:代码中动态添加搜索路径(无需修改Docker配置)
如果不方便调整Dockerfile,可以在app.py的最开头(所有模块导入语句之前)添加以下代码,动态将项目根目录加入搜索路径:
import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
方案3:将公共工具包打包安装(适合长期迭代的项目)
如果api_utils是多个Lambda函数共用的公共工具包,可以在api_utils目录下新增setup.py配置,将其封装为可安装的Python包,在每个Lambda的requirements.txt中添加本地依赖安装声明即可,后续导入逻辑更规范,无需额外调整路径。
内容的提问来源于stack exchange,提问作者picki23
相关产品推荐
相关产品推荐

