现象是给init进程发送SIGTERM信号,但是容器内部的其他进程却收到SIGKILL信号被强制杀死了。

这是因为linux进程退出的时候会调用do_exit()这个函数来通知其父子进程,如果这个进程是退出状态的init进程,就会向Namespace中的其他进程都发送一个SIGKILL信号

因此这个问题的根本原因在于作为容器init的进程捕获了SIGTERM信号并退出,但是并没有处理好父子进程的关系。正确的init进程应该在接收到SIGTERM信号之后,转发这个信号给子进程,然后等待子进程退出的SIGCHLD信号,这样后续就算调用do_exit函数也没有进程来给它强制关闭了,实现了进程的优雅退出。