I'm trying to build a Docker container that runs Python code on AWS Lambda. The build works fine, but when I test my code, I get the following error:
{"errorMessage": "Unable to import module 'function': No module named 'utils'", "errorType": "Runtime.ImportModuleError", "stackTrace": []}
I basically have two python scripts in my folder, function.py and utils.py, and I import some functions from utils.py and use them in function.py.
Locally, it all works fine, but when I build the Container and test it with the following curl command, I get the above error. Test curl command:
curl --request POST \
--url http://localhost:9000/2015-03-31/functions/function/invocations \
--header 'Content-Type: application/json' \
--data '{"Input": 4}'
Here's my dockerfile:
FROM public.ecr.aws/lambda/python:3.7
WORKDIR /
COPY . .
COPY function.py ${LAMBDA_TASK_ROOT}
COPY requirements.txt .
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"
CMD [ "function.lambda_handler" ]
What I read in related Stackoverflow questions is to try importing the functions from utils.py in another way, I've tried changing from utils import *
to from .utils import all
, I changed the WORKDIR in my Dockerfile, and I put the utils file in a separate utils folder and tried importing this way: from utils.utils import *
. I have also tried running the code in Python 3.8.
Here's my folder structure: Here's my folder structure
Does anyone know what I'm doing wrong?
CodePudding user response:
The Dockerfile statement COPY . .
copies all files to the working directory, which given your previous WORKDIR
, is /
.
To resolve the Python import issue, you need to move the Python module to the right directory:
COPY utils.py ${LAMBDA_TASK_ROOT}