【问题标题】:How to write a Dockerfile for an AWS Lambda function deployed as a container?如何为部署为容器的 AWS Lambda 函数编写 Dockerfile?
【发布时间】:2021-10-11 12:37:20
【问题描述】:

我一直在 AWS 上编写一个由多个 Rust lambda 组成的应用程序。其中一个 lambda 必须能够访问一堆外部依赖项,因此需要进行 Docker 化。据我了解,Rust 的官方 AWS Lambda 运行时在 lambda 的二进制文件中运行,不需要任何特殊设置或暴露端口。 我的 Dockerfile 如下:

# building omitted
FROM alpine:latest AS runner
WORKDIR /root/
COPY target/x86_64-unknown-linux-musl/release/my-lambda ./my-lambda
CMD [ "/root/my-lambda" ]

然后构建映像并将其推送到我的 Lambda 配置为从中获取其代码的 Amazon ECR 注册表。 在 AWS 控制台中使用任何测试数据调用该函数时得到的日志是:

IMAGE   Launch error: fork/exec /root/my-lambda: permission denied  Entrypoint: []  Cmd: [/root/my-lambda]  WorkingDir: [/root/]
START RequestId:  (...) Version: $LATEST
IMAGE   Launch error: fork/exec /root/my-lambda: permission denied  Entrypoint: []  Cmd: [/root/my-lambda]  WorkingDir: [/root/]
END RequestId:  (...)
REPORT RequestId:  (...)    Duration: 59.75 ms  Billed Duration: 60 ms  Memory Size: 128 MB Max Memory Used: 5 MB   
RequestId: (...) Error: fork/exec /root/my-lambda: permission denied
Runtime.InvalidEntrypoint
{
  "errorMessage": "RequestId: (...) Error: fork/exec /root/my-lambda: permission denied",
  "errorType": "Runtime.InvalidEntrypoint"
}

我知道问题不在于:

  • my-lambda 可执行文件的权限(任何人都可以执行它,我也尝试过 chmod -R 777 也很好)
  • libc 的可用性(我专门为 musl 目标编译,这是 Rust lambda 的最佳实践,因为 Rust 标准库几乎总是链接到比 Amazon Linux 更新的 glibc)
  • Docker 映像是否运行 - 如果我尝试在本地运行映像,我的 lambda 会运行并崩溃,因为找不到 AWS_LAMBDA_RUNTIME_API env var 或 lambda 所依赖的其他变量,正如预期的那样
  • 可执行文件的命名或是否使用相对路径调用 - 根据 lambda 约定将其命名为 bootstrap 并以 CMD ["./bootstrap"] 结尾并没有帮助

我还尝试在 dockerfile 中使用 ENTRYPOINT 而不是 CMD,并提供一个占位符 CMD,例如 doesnt.matter

谷歌搜索解决方案只发现了 Rust lambda 构建器图像和 Golang 的类似但不相关的错误。

【问题讨论】:

    标签: amazon-web-services docker rust aws-lambda


    【解决方案1】:

    没关系,想通了:

    FROM alpine:latest AS runner
    WORKDIR /var/task/
    COPY target/x86_64-unknown-linux-musl/release/my-lambda /var/task/my-lambda
    CMD [ "./bootstrap" ]
    

    原来可执行文件必须在 /var/task/ 目录中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多