在 ECS 任务中重启单个退出的容器

Posted

技术标签:

【中文标题】在 ECS 任务中重启单个退出的容器【英文标题】:Restart a single exited container in an ECS task 【发布时间】:2018-08-26 13:58:53 【问题描述】:

我有一个容器,它是 ECS 任务定义的一部分,我已将其标记为 essential=false,因为如果此容器出现故障,我不希望 ECS 代理关闭任务中的其他容器。在我的情况下,使容器“非必需”已经达到了预期的结果:容器崩溃,并且任务中的其他容器不会被删除或重新启动。

但是,我确实希望这个非必要的容器能够独立重新启动。有没有内置的方法可以做到这一点?基本上,如果容器退出,在该容器上运行docker startdocker restart(我们目前必须手动执行)。到目前为止,我对文档或探索 AWS 控制台都没有任何运气。

【问题讨论】:

您/您是否尝试过将容器作为 ECS 服务的一部分运行?如果此容器可能崩溃并且不会影响您任务中的其他容器,您可以将其作为单独的任务运行吗? 您是否尝试过使用 hypervisord 的其他容器镜像? Hypervisord 允许您重新启动容器进程,如果它崩溃并确保容器正在运行.. 因此,使用 hypervisord 容器将不会退出.. 如果它崩溃,您的应用程序将由 hpervisord 重新启动.. @arco444 好主意!这将需要我们的团队目前无法做出的一些改变,但这听起来是一个非常有希望的选择。如果我们实现这一点,我会在这里更新。谢谢! @AnkushTehale 有趣的想法!我会调查一下。谢谢! @elethan 您是否通过转换为服务解决了您的问题?我也遇到了这个问题,我在一个任务定义下拥有多个容器的原因是为了在集群内的容器之间进行通信。 【参考方案1】:

Docker 提供了一个restart policy,在您的情况下很有用(--restart always),但是,基于this thread,ECS 不支持重新启动现有容器。

建议和接受的解决方法是:

ECS 通过“服务”的概念支持此用例。 服务致力于不断使现实(已知状态)与 期望的状态,包括你期望的正在运行的任务数量 指定。如果由服务启动的任务停止,该服务将创建 一个新的任务来取代它。服务帮助您管理数量 您想要运行、部署、绑定和解除绑定的副本 负载均衡器,响应负载均衡器健康检查,并集成 具有自动缩放功能,因此您的服务可以自动缩小或缩小。 您可以查看documentation 了解更多详情。

【讨论】:

我会调查的。我知道我们已经对用户数据进行了一些配置。对于如何使用用户数据来重新启动已退出的容器,您有什么更具体的建议吗? @elethan,我想知道你是否可以通过用户数据设置Docker restart policy:--restart always。但是,正如this thread 中所讨论的,ECS 似乎不支持它。我会用调查结果更新答案。 感谢法比奥!我暂时无法测试这个解决方案,因为:工作时间紧迫。但是这个信息很有帮助,所以我给了你一个 +1!我会更新一次/如果我试试这个!

以上是关于在 ECS 任务中重启单个退出的容器的主要内容,如果未能解决你的问题,请参考以下文章

ECS 任务。如何在容器中使用 AWS CLI

无法访问 AWS ECS EC2 实例中的端口

如何在 AWS ECS 中扩展任务/容器

如何链接在 AWS ECS 任务中运行的 2 个容器

如何从 ECS 容器中获取任务 ID?

AWS 目标组在同一个 ECS 任务上注册 2 个目标?