出于演示目的,我想从容器内部使用PID 1终止进程。但是显然,kill 1不起作用:

$ sudo docker run -it centos
[root@3752d3a44f10 /]# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   15 pts/0    00:00:00 ps
[root@3752d3a44f10 /]# kill 1
[root@3752d3a44f10 /]# kill -9 1
[root@3752d3a44f10 /]# kill -SEGV 1
[root@3752d3a44f10 /]# <-- shell is still running


是否有一种方法可以从容器内部显式终止使用PID 1的进程?怎么样?

#1 楼

PID 1是一种特殊的PID,除非明确创建处理程序,否则它将忽略某些信号。 Docker对此有一些文档:因此,除非经过编码,否则该过程不会在SIGINT或SIGTERM上终止。


从此处开始:https://docs.docker.com/engine/reference/run/ #foreground

要终止PID 1,您必须显式声明SIGTERM信号的处理程序,或者在当前版本的Docker中,将--init命令中的docker run标志传递给仪器tini。

评论


非常感谢@edaemon,尤其是提到了我不知道的--init标志!

–西尔万·勒鲁(Sylvain Leroux)
18/12/6在16:30