【问题标题】:Is it possible to directly call docker run from AWS lambda是否可以直接从 AWS lambda 调用 docker run
【发布时间】:2017-11-25 13:09:14
【问题描述】:

我有一个已 dockerized 的 Java 独立应用程序。每次将对象放入 S3 存储时,我都想运行这个 docker。方法是通过我试图避免的 AWS 批处理来完成。

有没有直接简单的方法从 lambda 调用 docker run?

【问题讨论】:

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


    【解决方案1】:

    是和不是。

    您不能执行 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 上运行许多不同的作业。

    希望这会为您指明正确的方向。

    【讨论】:

      【解决方案2】:

      是的。可以使用 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。

      【讨论】:

        【解决方案3】:

        是的,试试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。和其他东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-03
          • 2015-11-26
          • 2018-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-16
          相关资源
          最近更新 更多