优雅地停止ECS容器

Ram*_*Ram 3 python amazon-ecs docker

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

我的问题是在消息处理期间容器将被突然杀死,有什么方法可以停止容器杀死,直到该过程完成并允许其停止,以便可以自动创建一个新的新容器当前容器使用旧代码处理消息。我的容器内部正在运行python代码。

谢谢

MrD*_*Duk 6

ECS默认会发送SIGTERM

停止任务

停止正在运行的任务。

StopTask任务上调用时,将向任务中运行的容器发出等效于docker stop的信息。这将导致SIGTERM和默认的30秒超时,此后将发送SIGKILL,并强制停止容器。如果容器正常处理SIGTERM并在收到它后30秒内退出,则不会发送SIGKILL。

注意

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

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


Yua*_*kun -4

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

使用 docker stop

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

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

docker stop --time 30 <CONTAINER>
Run Code Online (Sandbox Code Playgroud)

您需要确保进程SIGTERM正确处理信号。否则就会被一个SIGKILL信号粗暴地杀死。

使用 docker 杀死

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

docker kill --signal SIGQUIT <CONTAINER>
Run Code Online (Sandbox Code Playgroud)

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

  • 该问题特别请求有关 Amazon ECS (https://aws.amazon.com/ecs/) 的帮助,ECS 为您管理容器,并且不提供对原始 docker cli 命令的访问。 (4认同)