使用Zappa+Docker时遇handler未找到错误的技术求助
解决方案
错误原因
handler.lambda_handler是Python模块中的函数,并非可执行文件,直接将其作为Docker的CMD命令会导致容器无法找到对应可执行程序,从而触发"executable file not found"错误。
修复步骤
1. 安装AWS Lambda Runtime Interface Client
自定义Python镜像需要该工具处理Lambda的请求交互,在python-deps阶段添加依赖安装:
# 在python-deps阶段的pipenv安装命令中添加awslambdaric RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy awslambdaric
2. 修正CMD命令
将原CMD替换为通过Runtime Interface Client调用Python函数的格式:
CMD ["awslambdaric", "handler.lambda_handler"]
该命令会借助awslambdaric工具,正确识别并调用handler.py中的lambda_handler函数,符合Lambda Docker镜像的运行规范。
3. 验证文件路径
可在Dockerfile中添加验证步骤,确保handler.py被正确复制到目标目录:
# 在复制文件到FUNCTION_DIR后添加 RUN ls -la $FUNCTION_DIR
完整修正后的Dockerfile
FROM python:3.8 as base # Setup env ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONFAULTHANDLER 1 FROM base AS python-deps # Install pipenv and compilation dependencies RUN pip install pipenv RUN python -m pip install --upgrade pip RUN apt-get update && apt-get install -y --no-install-recommends gcc RUN apt-get install postgresql-client libjpeg-dev -y RUN apt-get install gcc libc-dev musl-dev zlib1g zlib1g-dev -y # Install python dependencies in /.venv COPY Pipfile . COPY Pipfile.lock . RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy awslambdaric FROM base AS runtime # Copy virtual env from python-deps stage COPY --from=python-deps /.venv /.venv ENV PATH="/.venv/bin:$PATH" ARG FUNCTION_DIR="/var/task/" COPY ./ $FUNCTION_DIR # Grab the zappa handler.py and put it in the working directory RUN ZAPPA_HANDLER_PATH=$( \ python -c "from zappa import handler; print (handler.__file__)" \ ) \ && echo $ZAPPA_HANDLER_PATH \ && cp $ZAPPA_HANDLER_PATH $FUNCTION_DIR CMD ["awslambdaric", "handler.lambda_handler"]
运行验证
重新构建并运行容器:
docker build -t lambda-docker-flask:latest . docker run -p 9000:8080 lambda-docker-flask:latest
可通过以下命令测试服务是否正常:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
此外,请确保zappa_settings.json等配置文件已被正确复制到容器中,虚拟环境依赖完整。
内容的提问来源于stack exchange,提问作者Leonardo Furtado
相关产品推荐
相关产品推荐

