Docker STOPSIGNAL做了什么?

时间:2018-06-17 15:39:53

标签: docker dockerfile

我试图了解dockerfile中STOPSIGNAL命令的确切含义。所以根据Docker Docs

  

STOPSIGNAL指令设置系统调用信号   送到集装箱出口。该信号可以是有效的无符号信号   对于与内核的系统调用表中的位置匹配的数字   例如,实例9,或SIGNAME格式的信号名称   SIGKILL。

通过这个解释,我理解有一些信号被发送到docker容器,告诉内部应用程序停止。但是当我用sudo docker stop container-name关闭一个正在运行的容器时,它不会自动停止在里面运行的所有内容吗?我可以输入此命令而不会出现任何错误。那么在dockerfile中明确定义STOPSIGNAL是不是多余了?

查看Nginx is built with a dockerfile的方式,使用命令STOPSIGNAL SIGTERM。但那个exaclty意味着什么?它会破坏某些内容而不定义STOPSIGNAL吗?

2 个答案:

答案 0 :(得分:5)

SIGTERM是发送到容器以阻止它们的默认信号:https://docs.docker.com/engine/reference/commandline/stop/

STOPSIGNAL允许您覆盖发送到容器的默认信号。将其从Dockerfile中删除不会造成任何伤害 - 它将保持默认为SIGTERM

话虽如此,目前尚不清楚作者为何明确将STOPSIGNAL定义为SIGTERM

查看此commit,我们可以看到STOPSIGNAL曾经设置为SIGQUIT

我的猜测是他们在进行更改后明确地将其留在文档中。

在此讨论变更:https://github.com/nginxinc/docker-nginx/issues/167

答案 1 :(得分:3)

运行docker stop时,您正在指示Docker守护程序向运行容器的进程发送信号以停止。

默认情况下,它通过发送SIGTERM然后等待一段时间来完成此操作,以便进程可以正常退出。如果流程未在特定时间内终止,则会发送SIGKILL

但是,您的应用可能会配置为收听不同的信号 - 例如SIGUSR1SIGUSR2

在这些情况下,您可以使用STOPSIGNAL Dockerfile指令覆盖默认值。