我有一个Java独立应用程序,我已经使用了dockerized。每次将对象放入S3存储时,我想运行此docker。在途中是通过AWS批处理,我试图避免。
是否有直接且简单的方法从lambda调用docker run?
答案 0 :(得分:7)
是和否。
您不能执行的是执行docker run
以在Lambda调用的上下文中运行容器。但是您可以触发ECS上的任务执行。为此,您需要在ECS上设置集群,这意味着您需要为至少一个EC2实例付费。因此,不使用Docker可能会更好,但我对你的应用程序判断得太少了。
有很多文章如何连接S3,Lambda和ECS。以下是亚马逊您可能感兴趣的一篇非常深入的文章:
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容器:
result = boto3.client('ecs').run_task(
cluster=cluster,
taskDefinition=task_definition,
overrides=overrides,
count=1,
startedBy='lambda'
)
我们传入我们想要运行容器的cluster
的名称,以及定义要运行哪个容器的任务定义,它需要的资源等等。 overrides
是一个字典/地图,其中包含您要在任务定义中覆盖的设置,我们用它来指定我们要运行的命令(即docker run
的参数)。这使我们能够使用相同的Lambda函数在ECS上运行许多不同的作业。
希望指出你正确的方向。
答案 1 :(得分:2)
是。可以使用SCAR将容器运行到AWS Lambda中存储在Docker Hub中的Docker映像。
例如,您可以创建一个Lambda函数,以便在Docker Hub中的ubuntu:16.04映像中执行容器,如下所示:
SELECT dT.CheckOutDate
,(SELECT SUM(NrOfGuests)
FROM tblGuests tG
WHERE tG.CheckInDate <= dT.CheckOutDate
AND tG.CheckOutDate >= dT.CheckOutDate
AND tG.IsCancelled = 0
AND tG.NoShow = 0
) AS NrOfGuests
FROM (
SELECT DISTINCT CheckOutDate
FROM tblGuests
) AS dT
ORDER BY dT.CheckOutDate
然后,您可以在每次调用函数时在该容器中运行命令或shell脚本:
scar init ubuntu:16.04
您可以使用存储在Docker Hub中的自己的Docker镜像。某些限制适用但可以有效地用于在AWS Lambda上运行通用应用程序。它还具有用于文件处理事件驱动应用程序的编程模型。它使用了uDocker。
答案 2 :(得分:1)
是的,请尝试Udocker。
Udocker是一个用Python编写的简单工具,它具有一组最小的依赖项,因此可以在各种Linux系统中执行。
udocker不使用docker也不需要安装它。
udocker&#34;执行&#34;通过在提取的容器上简单地提供类似chroot的环境来容器。当前实现使用PRoot来模拟chroot而不需要特权。
实施例
从泊坞窗中心拉出并列出拉出的图像。
udocker pull fedora
从拉出的图像创建容器并运行它。
udocker create --name=myfed fedora
udocker run myfed cat /etc/redhat-release
还可以查看Hackernoon。
由于: 在Lambda中,您唯一可以写的地方是/ tmp。但udocker默认会尝试写入homedir。和其他东西。