Lambda Docker Build GO - RIE:没有这样的文件或目录

PHP*_*oob 5 go amazon-web-services docker aws-lambda

我正在尝试为 golang 函数构建 lambda docker 映像,在阅读 AWS 上的文档后,我复制了使用推荐的基本映像提供的示例 dockerfilelambda/provided:al2

更改了提供 golang 运行时的第一个基础映像,以匹配 1.19 的本地 golang 运行时。

Dockerfile:

FROM golang:1.19 as build
WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . .

RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main

FROM public.ecr.aws/lambda/provided:al2

COPY --from=build /app/main ./main
ENTRYPOINT [ "./main" ]
Run Code Online (Sandbox Code Playgroud)

成功构建后,我运行此命令(来自 aws 文档): docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 --entrypoint /aws-lambda/aws-lambda-rie go-test-image:latest ./main

Which returns the error: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/aws-lambda/aws-lambda-rie": stat /aws-lambda/aws-lambda-rie: no such file or directory: unknown.
Run Code Online (Sandbox Code Playgroud)

但阅读文档,AWS提供的图像已经包含aws-lambda-rie

我也尝试过运行: docker run -p 9000:8080 go-test-image:latest

它返回缺少 lambda 环境变量的错误:

 expected AWS Lambda environment variables [_LAMBDA_SERVER_PORT AWS_LAMBDA_RUNTIME_API]
Run Code Online (Sandbox Code Playgroud)

关于我在这方面缺少什么或导致这些错误的原因的任何想法。

Von*_*onC 2

unable to start container process: exec: "/aws-lambda/aws-lambda-rie": stat /aws-lambda/aws-lambda-rie: no such file or directory: unknown.

首先使您的 Docker 映像独立且可运行,无需aws-lambda-rie外部:将其直接添加到您的 Docker 映像(而不是在运行时挂载它/aws-lambda/aws-lambda-rie):

FROM golang:1.19 as build
WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main

FROM public.ecr.aws/lambda/provided:al2

# Install aws-lambda-rie
RUN curl -Lo /usr/bin/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && chmod +x /usr/bin/aws-lambda-rie
COPY --from=build /app/main ./main
ENTRYPOINT [ "/usr/bin/aws-lambda-rie", "./main" ]
Run Code Online (Sandbox Code Playgroud)

然后运行容器而不aws-lambda-rie从主机安装:

FROM golang:1.19 as build
WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main

FROM public.ecr.aws/lambda/provided:al2

# Install aws-lambda-rie
RUN curl -Lo /usr/bin/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && chmod +x /usr/bin/aws-lambda-rie
COPY --from=build /app/main ./main
ENTRYPOINT [ "/usr/bin/aws-lambda-rie", "./main" ]
Run Code Online (Sandbox Code Playgroud)

如图所示,您可以在这里看到另一种添加方式aws-lambda-rie

ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie /usr/bin/aws-lambda-rie
COPY entry.sh /
RUN chmod 755 /usr/bin/aws-lambda-rie /entry.sh
ENTRYPOINT [ "/entry.sh" ]
Run Code Online (Sandbox Code Playgroud)

这依赖于支持 URL 作为源的Dockerfile ADD 。


要返回建议的 Dockerfile,请使用ENTRYPOINT [ "/usr/bin/aws-lambda-rie", "./main" ]设置容器的默认行为。这意味着当容器启动时,它将运行命令/usr/bin/aws-lambda-rie ./main

  • /usr/bin/aws-lambda-rie:这就是 Lambda 运行时接口模拟器 (RIE)。其目的是在本地模仿AWS Lambda环境。该工具拦截 Lambda 运行时 API 调用,并允许您的函数代码像在实际 Lambda 环境中一样运行。

  • ./main:这是您想要运行的实际编译的 Go 二进制文件(您的 Lambda 函数)。

因此,当您启动容器时,RIE 会启动,然后./main在模拟的 Lambda 环境中运行您的二进制文件。这样,您就可以发出 HTTP 请求来localhost:8080/2015-03-31/functions/function/invocations测试您的 Lambda 函数,就像在实际的 AWS 环境中触发它一样。