我试图了解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
吗?
答案 0 :(得分:5)
SIGTERM
是发送到容器以阻止它们的默认信号:https://docs.docker.com/engine/reference/commandline/stop/
STOPSIGNAL
允许您覆盖发送到容器的默认信号。将其从Dockerfile中删除不会造成任何伤害 - 它将保持默认为SIGTERM
。
话虽如此,目前尚不清楚作者为何明确将STOPSIGNAL
定义为SIGTERM
。
查看此commit,我们可以看到STOPSIGNAL
曾经设置为SIGQUIT
。
我的猜测是他们在进行更改后明确地将其留在文档中。
答案 1 :(得分:3)
运行docker stop
时,您正在指示Docker守护程序向运行容器的进程发送信号以停止。
默认情况下,它通过发送SIGTERM
然后等待一段时间来完成此操作,以便进程可以正常退出。如果流程未在特定时间内终止,则会发送SIGKILL
。
但是,您的应用可能会配置为收听不同的信号 - 例如SIGUSR1
和SIGUSR2
。
在这些情况下,您可以使用STOPSIGNAL
Dockerfile指令覆盖默认值。