优雅地停止ecs容器

时间:2018-03-29 13:41:02

标签: python docker amazon-ecs

我有一些docker容器,它监听RabbitMQ并处理收到的消息。我有一个代码管道,它启动了代码重建,并在代码提交时更新任务。

我的问题是容器会在消息处理过程中突然被杀死有任何方法我可以停止容器查杀,直到进程完成并允许它停止,以便新的新容器将自动创建为我我可以使用当前容器处理带有旧代码的消息。我的容器正在里面运行python代码。

由于

2 个答案:

答案 0 :(得分:6)

ECS by default sends a SIGTERM

  

StopTask

     

停止正在运行的任务。

     

在任务上调用StopTask时,相当于docker stop   发给在任务中运行的容器。这导致了   SIGTERM和默认的30秒超时,之后发送SIGKILL   并强行停止集装箱。如果容器处理   SIGTERM优雅地在收到后30秒内退出,没有   SIGKILL已发送。

     

注意

     

可以在Amazon ECS上配置默认的30秒超时   带有ECS_CONTAINER_STOP_TIMEOUT变量的容器代理程序。更多   信息,请参阅中的Amazon ECS容器代理配置   Amazon Elastic Container Service开发人员指南。

了解这一点,您可以在应用中添加一个简单的检查以捕获SIGTERM,并做出适当的反应。

答案 1 :(得分:0)

在Docker中实现优雅停止的两种方法:

使用泊坞窗停止

当向容器发出docker stop命令时,Docker会向容器内的进程发出SIGTERM信号,并在清理容器之前等待10秒。

您可以指定10秒以外的超时:

docker stop --time 30 <CONTAINER>

您需要确保该过程正确处理SIGTERM信号。否则它会被SIGKILL信号粗暴地杀死。

使用docker kill

默认情况下,docker kill命令会向进程发送SIGKILL信号。但您可以指定另一个要使用的信号:

docker kill --signal SIGQUIT <CONTAINER>

还要确保进程正确处理指定的信号。比docker stop更糟糕的是,docker kill命令没有超时行为。