如何在本地运行一次性的Docker容器(从容器内部触发)

10

当我在Heroku上托管应用程序时,我经常通过Heroku API从代码中触发一次性dynos来在后台处理繁重的工作。我最近在AWS上设置了一些堆栈,并通过使用AWS ECS运行任务来遵循类似的模式。

我没有使用长时间运行的队列工作者来完成这个任务,因为硬件资源根据特定的任务而变化很大,通常工作量会在高峰期出现。

对于本地开发,我通常会跳过这个主题,要么在正在运行的容器内执行后台任务,要么手动从控制台触发后台命令。那么,在本地运行一次性容器的好方法是什么?


你觉得从代码内部触发 'heroku local:run' 怎么样? - Yoni Rabinovitch
我正在运行PHP。如何在容器中运行而不是作为触发进程的子进程运行?除此之外,我还在寻找一个通用的解决方案来解决这个问题。 - André
也许你可以在本地开发环境中运行第二个容器,在其中有一个“生成器”进程负责根据主容器中 PHP 接收到的输入启动“heroku local:run”进程?因此,在 Heroku 上,您使用平台 API 启动一次性 dyno,而在开发过程中,您触发辅助容器来启动“heroku local:run”进程。 - Yoni Rabinovitch
听起来你需要让第一个容器调用AWS API并在ECS上创建第二个容器。 - kevzettler
3个回答

0
ECS 支持定时任务,如果您知道计划中的高峰时间,可以使用定时任务在预定时间启动 Fargate 容器。
如果不知道高峰时间,我们可以编写一个小的 API Gateway -> Lambda 函数,通过在 POST 请求到 API Gateway 终点的变量中定义 CPU/内存/端口等,动态地启动 Fargate 容器。或者预先创建任务定义,并将任务定义传递给 API,这是另一种选择,如果您知道容器的大部分 "设置" 应该是什么。

0

您可以直接从容器内部调用ECS RunTask API

您只需要设置ECS任务角色以具有运行任务的权限,并在容器中安装AWS CLI或任何AWS SDK以调用runtask调用即可。


0

你可以将Docker套接字作为卷传递

volumes:
     - /var/run/docker.sock:/var/run/docker.sock

在此之后,您可以在容器内运行Docker命令,并且它们将由主机上的Docker执行。

特别地,您可以运行:

docker run ...

或者

docker start ...

(也许你需要通过 Dockerfile 中的命令在容器中安装 Docker)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接