我有一些docker容器,它监听RabbitMQ并处理收到的消息。我有一个代码管道,它启动了代码重建,并在代码提交时更新任务。
我的问题是容器会在消息处理过程中突然被杀死有任何方法我可以停止容器查杀,直到进程完成并允许它停止,以便新的新容器将自动创建为我我可以使用当前容器处理带有旧代码的消息。我的容器正在里面运行python代码。
由于
答案 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
命令会向进程发送SIGKILL
信号。但您可以指定另一个要使用的信号:
docker kill --signal SIGQUIT <CONTAINER>
还要确保进程正确处理指定的信号。比docker stop
更糟糕的是,docker kill
命令没有超时行为。