使用AWS Lambda Python容器时遇Runtime.InvalidEntrypoint错误求助
解决AWS Lambda自定义镜像中
fork/exec /tmp: permission denied错误 问题本质
这个错误核心是Lambda运行时被要求执行**目录(/tmp)**而非可执行文件/合规启动脚本。Lambda自定义镜像要求ENTRYPOINT/CMD必须指向能启动Lambda运行时的程序,完全偏离这个规范就会触发权限拒绝。
可行解决办法
1. 保留基础镜像默认启动逻辑
public.ecr.aws/lambda/python:3.10自带合规的ENTRYPOINT和CMD,别直接把它们改成/tmp。正确的Dockerfile写法应该是只加依赖和工具,保留原有启动流程:
FROM public.ecr.aws/lambda/python:3.10 # 安装Python依赖 COPY requirements.txt ${LAMBDA_TASK_ROOT} RUN pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" # 安装gossamer3到全局可执行路径(别放/tmp) RUN curl -o /usr/local/bin/gossamer3 https://xxx/path/to/gossamer3 \ && chmod +x /usr/local/bin/gossamer3 # 把Lambda代码放到任务根目录 COPY app.py ${LAMBDA_TASK_ROOT} # 只设置CMD指向你的处理函数,保留原ENTRYPOINT CMD ["app.lambda_handler"]
2. 修正gossamer3的安装配置
- 别把gossamer3丢到/tmp,Lambda启动时/tmp是临时挂载目录,权限和路径都不稳定,优先选
/usr/local/bin这类全局可执行路径。 - 必须给gossamer3加执行权限:
chmod +x /usr/local/bin/gossamer3,不然就算路径对了也跑不起来。
3. 别乱改Workdir
Lambda默认工作目录是${LAMBDA_TASK_ROOT}(也就是/var/task),改成/tmp会导致运行时找不到你的代码和依赖。要么保持默认,要么明确设置为${LAMBDA_TASK_ROOT}。
4. 重置Lambda控制台的ENTRYPOINT/CMD配置
如果之前在控制台手动覆盖过ENTRYPOINT/CMD,赶紧改回来:
- ENTRYPOINT用基础镜像默认值(一般是
/lambda-entrypoint.sh) - CMD设成你的Lambda处理函数,格式是
["module_name.function_name"]
本地验证步骤
先在本地测试镜像是否正常,避免反复部署踩坑:
- 构建镜像后启动容器:
docker run -p 9000:8080 your-image-tag
- 发送测试请求:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
如果本地能正常返回响应,说明镜像配置没问题,再部署到Lambda测试就行。
内容的提问来源于stack exchange,提问作者Zafar khan
相关产品推荐
相关产品推荐

