从内部将SIGINT发送到Docker容器

问题描述

我一直在努力做到这一点,以便能够从内部关闭docker容器。我已经知道使用tini是最好的方法

我已将init: true添加到我的docker-compose.yml中,并且可以看到docker-init以PID 1的身份运行。但是,让我从shell脚本中关闭容器的唯一命令是使用kill 1,但是我想正常地关闭容器,以便它可以进行一些清理。

我尝试使用诸如kill -SIGINT 1之类的命令导致错误kill: Illegal option -Skill -INT 1kill -2 1似乎都什么都不做。

我似乎无法弄清楚我可以使用的命令。如果有init的替代方案,那么也可以选择。

解决方法

容器内的应用程序不需要任何特殊设置即可关闭;它可以运行自己的关闭序列并退出,并且当它退出时,容器也将退出。如果您尝试从使用docker exec启动的调试外壳中执行此操作,则可以只使用docker stop发送SIGTERM,然后发送SIGKILL。 (...并将docker exec外壳用于调试;它不应该是与容器交互的主要方式。)

如果您需要向容器发送非默认信号,docker kill可以选择:

docker kill --signal SIGINT container_name

就在调试外壳中使用 kill (1)而言,基础 kill (2)函数的man page注意:

可以发送到进程ID 1的唯一信号是 init 进程,而 init 已为其明确安装了信号处理程序。这样做是为了确保不会意外关闭系统。

看起来tini collects and forwards的信号范围很广,除了SIGFPE,SIGILL,SIGSEGV,SIGBUS,SIGABRT,SIGTRAP,SIGSYS和不可捕获的信号(尤其是SIGKILL)之外的所有信号。由于它确实注册了信号处理程序,因此kill -INT 1应该将该信号转发到实际的容器进程。 (它的pid可能是 2,因此kill -INT 2也应该告诉该进程停止。)