为什么我无法在 AWS lambda 函数的 docker 容器内的 `lambda_function.py` 中运行 `from Algorithm import foo` ?

问题描述 投票:0回答:1

我正在按照 本教程 为运行 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

我已经检查过这个类似的问题,但那里的答案没有帮助。

python docker aws-lambda aws-lambda-containers
1个回答
0
投票

通过在

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}

© www.soinside.com 2019 - 2024. All rights reserved.