是否可以从AWS lambda直接调用docker run

时间:2017-06-22 10:05:40

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

我有一个Java独立应用程序,我已经使用了dockerized。每次将对象放入S3存储时,我想运行此docker。在途中是通过AWS批处理,我试图避免。

是否有直接且简单的方法从lambda调用docker run?

3 个答案:

答案 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。和其他东西。