Lambda 容器镜像抱怨入口点需要处理程序名称作为第一个参数

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

当我运行 AWS Lambda 容器 (Docker) 映像时,例如:

docker run public.ecr.aws/lambda/java bash

我收到以下错误:

entrypoint requires the handler name to be the first argument

处理程序名称应该是什么?

amazon-web-services docker aws-lambda
4个回答
9
投票

这取决于运行时的语言是什么。例如,如果是 NodeJS,那么处理程序名称应该如下所示:

"app.handler"

如果是Java,那么它应该是这样的:

"com.example.LambdaHandler::handleRequest"

图像将在

LAMBDA_TASK_ROOT
中查找它们,因此您需要确保在构建图像时将代码(或编译后的代码)复制到该文件夹,例如:

COPY target/* ${LAMBDA_TASK_ROOT}

9
投票

就我而言,我想在 gitlab-ci 中使用 lambda 图像。 解决方案是通过将以下行添加到我的 Dockerfile 来覆盖基本映像入口点:

ENTRYPOINT ["/bin/bash", "-l", "-c"]

请注意,这意味着该图像将不再可在亚马逊的 lambda 中使用。


0
投票

线程中的人是对的,我用我的 Node.js 小脚本卡在同一个地方。

所以,对我来说正确的解决方案是添加

ENTRYPOINT ["/lambda-entrypoint.sh", "helloWorldFunction.handler"]

码头工人:

FROM public.ecr.aws/lambda/nodejs:14
COPY helloWorldFunction.js package*.json ./
RUN npm install
ENTRYPOINT ["/lambda-entrypoint.sh", "helloWorldFunction.handler"] 
CMD [ "helloWorldFunction.handler" ]

lambda-entrypoint.sh 已经放置在 aws 基础镜像中,不需要 手动添加

helloWorldFunction.js:

exports.handler = async (event, context) => {
    return "Hello World!";
};

另外,如果您使用 Visual Studio 和 AWS Toolkit 进行部署 - 请清除 aws-lambda-tools-default.json 中的“image-command”字段,因为它会覆盖 docker 的 CMD


0
投票

我想添加我的系统和场景,以防有人做类似的事情(Windows)。我收到此错误消息,但实际上是在本地测试我的 python Lambda 和 Docker 容器,然后将其放入云中。我的项目目录结构是src/main/main.py。这使得我的 Dockerfile 看起来像这样:

# Use the official AWS Lambda Python base image.
FROM public.ecr.aws/lambda/python:3.11

# Set the working directory.
WORKDIR /var/task

# Copy contents of local folders into /var/task/{directory-name}, in the container.
COPY ./main ./main
COPY ./utils ./utils
COPY __init__.py ./

# If you have additional module requirements, copy the dependencies.txt file and install them.
COPY dependencies.txt ./

RUN pip install -r dependencies.txt

# Set the Lambda handler function name - folder.file.function
CMD ["main.main.handler"]

对我来说,当我开始在 Docker 命令行参数中使用 
--platform linux/amd64

时,这个错误就得到了修复。 IE。以下三步过程:

    run docker build --platform linux/amd64 -t my_image_name:test .
  1. docker run --platform linux/amd64 my_image_name:test -p 9000:8080.
  2. 
    
  3. 最后,你可以用curl来测试容器。

curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'

AWS 文档
此处

(使用适用于 Python 的 AWS 基础映像部分)中提到了这些命令和此流程,但我没有遵循指示! :)

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