我正在按照 本教程 为运行 python 3.11 的 AWS lambda 函数构建 Docker 映像。
当我在本地运行
python lambda_function.py
时,它可以在lambda_function.py第1行成功运行from algorithm import foo as data_processor
。
但是当我将程序打包成 Docker 镜像并运行它时,它会生成一个错误,提示
Unable to import module 'lambda_function': No module named 'algorithm'
。
这就是我在本地计算机中测试 docker 镜像的方法。
# start a docker container
docker run --platform linux/amd64 -p 9000:8080 my-image:latest
# Open another terminal. Then trigger the lambda function
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
这是我的文件夹结构
.
├── Dockerfile
├── algorithm
│ ├── __init__.py
│ └── foo.py
├── lambda_function.py
└── requirements.txt
这是我的 Dockerfile
FROM public.ecr.aws/lambda/python:3.11.2024.08.09.13
# Copy requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install --upgrade pip
# Install the specified packages
RUN pip install -r requirements.txt
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
COPY algorithm/ ${LAMBDA_TASK_ROOT}
# Set the CMD to your lambda_handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.lambda_handler" ]
我已经检查过
${LAMBDA_TASK_ROOT}
等于 /var/task
。并且 sys.path
包含 '/var/task'
。
为什么我无法在 docker 容器内的
from algorithm import foo as data_processor
中运行 lambda_function.py
?
我已经检查过这个类似的问题,但那里的答案没有帮助。
通过在
print("Directory listing:", os.listdir('/var/task'))
之前添加from algorithm import foo as data_processor
,我发现COPY algorithm/ ${LAMBDA_TASK_ROOT}
实际上将algorithm/
下的所有文件复制到${LAMBDA_TASK_ROOT}
。
我的意思是我可以在
__init__.py
下看到 foo.py
和 ${LAMBDA_TASK_ROOT}
。
因此,为了正确地将文件夹复制到
${LAMBDA_TASK_ROOT}
,我应该在 Dockerfile 中编写 COPY algorithm ${LAMBDA_TASK_ROOT}/algorithm
而不是 COPY algorithm/ ${LAMBDA_TASK_ROOT}
。