【发布时间】:2017-11-25 13:09:14
【问题描述】:
我有一个已 dockerized 的 Java 独立应用程序。每次将对象放入 S3 存储时,我都想运行这个 docker。方法是通过我试图避免的 AWS 批处理来完成。
有没有直接简单的方法从 lambda 调用 docker run?
【问题讨论】:
标签: amazon-web-services docker aws-lambda amazon-ecs
我有一个已 dockerized 的 Java 独立应用程序。每次将对象放入 S3 存储时,我都想运行这个 docker。方法是通过我试图避免的 AWS 批处理来完成。
有没有直接简单的方法从 lambda 调用 docker run?
【问题讨论】:
标签: amazon-web-services docker aws-lambda amazon-ecs
是和不是。
您不能执行 docker run 以在 Lambda 调用的上下文中运行容器。但是您可以触发 ECS 上的任务执行。为此,您需要在 ECS 上设置一个集群,这意味着您需要为至少一个 EC2 实例付费。因此,不使用 Docker 可能会更好,但我对您的应用程序知之甚少,无法判断。
有很多关于如何连接 S3、Lambda 和 ECS 的文章。以下是您可能感兴趣的 Amazon 的一篇非常深入的文章:
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
如果您正在寻找代码,此存储库实现了上面文章中讨论的内容:
https://github.com/awslabs/lambda-ecs-worker-pattern
这是我们在 Lambda 函数 (Python) 中用于从 Lambda 运行 Docker 容器的 sn-p:
result = boto3.client('ecs').run_task(
cluster=cluster,
taskDefinition=task_definition,
overrides=overrides,
count=1,
startedBy='lambda'
)
我们传入要在其上运行容器的cluster 的名称,以及定义要运行哪个容器、它需要的资源等的任务定义。 overrides 是一个字典/映射,其中包含您要在任务定义中覆盖的设置,我们使用它来指定我们要运行的命令(即 docker run 的参数)。这使我们能够使用相同的 Lambda 函数在 ECS 上运行许多不同的作业。
希望这会为您指明正确的方向。
【讨论】:
是的。可以使用 SCAR 在 AWS Lambda 内运行存储在 Docker Hub 中的 Docker 映像容器。
例如,您可以创建一个 Lambda 函数来执行 Docker Hub 中的 ubuntu:16.04 映像之外的容器,如下所示:
scar init ubuntu:16.04
然后您可以在每次调用该函数时在该容器中运行命令或 shell 脚本:
scar run scar-ubuntu-16-04 whoami
SCAR: Request Id: ed5e9f09-ce0c-11e7-8375-6fc6859242f0
Log group name: /aws/lambda/scar-ubuntu-16-04
Log stream name: 2017/11/20/[$LATEST]7e53ed01e54a451494832e21ea933fca
---------------------------------------------------------------------------
sbx_user1059
您可以使用存储在 Docker Hub 中的自己的 Docker 映像。存在一些限制,但它可以有效地用于在 AWS Lambda 上运行通用应用程序。它还具有用于文件处理事件驱动应用程序的编程模型。它在后台使用uDocker。
【讨论】:
是的,试试Udocker。
Udocker 是一个用 Python 编写的简单工具,它具有最少的依赖集,因此可以在各种 Linux 系统中执行。
udocker 不使用 docker,也不需要安装它。
udocker 通过简单地在提取的容器上提供类似 chroot 的环境来“执行”容器。当前的实现使用 PRoot 来模拟 chroot 而不需要特权。
示例
从 docker hub 拉取并列出拉取的图像。
udocker pull fedora
从拉取的镜像创建容器并运行它。
udocker create --name=myfed fedora
udocker run myfed cat /etc/redhat-release
检查Hackernoon 也很好。
因为: 在 Lambda 中,您唯一可以写入的位置是 /tmp。但是 udocker 默认会尝试写入 homedir。和其他东西。
【讨论】: