如何解决从内部将SIGINT发送到Docker容器
我一直在努力做到这一点,以便能够从内部关闭docker容器。我已经知道使用tini
是最好的方法。
我已将init: true
添加到我的docker-compose.yml中,并且可以看到docker-init以PID 1
的身份运行。但是,让我从shell脚本中关闭容器的唯一命令是使用kill 1
,但是我想正常地关闭容器,以便它可以进行一些清理。
我尝试使用诸如kill -SIGINT 1
之类的命令导致错误kill: Illegal option -S
或kill -INT 1
和kill -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
也应该告诉该进程停止。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。