You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda Python多源码包Dockerfile构建问题排查

Lambda Python镜像无法导入自定义模块的问题分析与解决

核心原因

AWS Lambda官方Python镜像(public.ecr.aws/lambda/python:3.9)和普通python:3.9镜像的工作目录与模块搜索路径逻辑存在差异:

  • 普通Python镜像默认将当前工作目录加入sys.path,能直接识别同级目录下的模块;
  • Lambda镜像默认工作目录为/var/task,且默认sys.path仅包含该目录本身,不会自动递归子目录,同时Lambda的handler路径要求严格对应模块的目录结构。

具体解决方案

1. 修正Dockerfile的文件复制逻辑

确保所有源码目录(src、Runner)都完整复制到/var/task下,保留原有目录结构:

# 基础镜像
FROM public.ecr.aws/lambda/python:3.9

# 复制依赖文件(如果有)
COPY requirements.txt ${LAMBDA_TASK_ROOT}

# 安装依赖
RUN pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

# 复制源码目录到Lambda任务根目录(/var/task)
COPY src/ ${LAMBDA_TASK_ROOT}/src/
COPY Runner/ ${LAMBDA_TASK_ROOT}/Runner/

# 设置Python路径(关键)
ENV PYTHONPATH=${LAMBDA_TASK_ROOT}

# 指定Lambda handler(格式:目录.模块名.方法名)
CMD ["Runner.mainRunner.handler"]

注:${LAMBDA_TASK_ROOT}是Lambda镜像内置的环境变量,对应/var/task。

2. 调整Lambda Handler的路径配置

本地测试容器时,必须使用完整模块路径指定handler,而不是直接写mainRunner.handler:

docker run -p 9000:8080 your-image:latest lambda-entrypoint.sh Runner.mainRunner.handler

这里的Runner.mainRunner对应/var/task/Runner/mainRunner.py的模块路径,handler是该文件中的目标方法。

3. 确保包目录的可识别性

如果src下的子目录是Python包,每个包目录下必须创建空的__init__.py文件,让Python识别为可导入的包结构。Runner目录若需作为包导入,同样需要添加该文件(仅直接导入Runner/mainRunner.py时可省略,但建议统一添加以避免潜在问题)。

4. 手动调整sys.path(备选方案)

如果不想通过环境变量设置PYTHONPATH,可以在mainRunner.py的开头添加以下代码,将项目根目录加入模块搜索路径:

import sys
from pathlib import Path

# 获取项目根目录(/var/task)
project_root = str(Path(__file__).parent.parent)
if project_root not in sys.path:
    sys.path.append(project_root)

内容的提问来源于stack exchange,提问作者surferdev44

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:15:28