我正在通过ECS运行一个docker容器。启动时,容器会运行一个执行某些特定操作的进程。这些操作可能需要几分钟才能完成。
ECS将在群集中运行多个EC2实例(并且每个实例运行多个容器)。这些容器的启动将根据我们向CloudWatch报告的某些特定指标自动调整。
当我们需要缩小容器时,就会出现问题。我们需要优雅地关闭容器(因为它们将运行该进程),我不希望它在没有完成运行进程的情况下终止容器。
我已经看到,Docker不支持关闭钩子https://github.com/moby/moby/issues/2100
我想这样做的一种方法是缩小编号。应用程序本身的实例,通过跟踪正在运行的实例及其状态。我只是想知道在这方面是否还有其他解决方案/想法?
虽然docker不支持关闭挂钩,但可以使用SIGINT
和SIGTERM
信号进行主要的docker进程。只需定义进程的PID并在entrypoint.sh
中使用它:
trap "{ echo Received SIGTERM; kill -s SIGTERM $MAIN_PROCESS_ID; wait $MAIN_PROCESS_ID; }" SIGTERM
trap "{ echo Received SIGINT; kill -s SIGINT $MAIN_PROCESS_ID; wait $MAIN_PROCESS_ID; }" SIGINT