我正在使用不同的Docker映像来运行代码,并注意到以下内容:
$ time sudo docker stop $(sudo docker run -dit --rm centos:latest)
509285200bcf4ea8389219319b6c4af6554abf9f1c9d9ffb152cd109b6a21453
real 0m1,374s
user 0m0,087s
sys 0m0,027s
$ time sudo docker stop $(sudo docker run -dit --rm debian:latest)
221221b4b9238de633ca68d9539b024c06d015ea503a8b7fd5b827dc903193b8
real 0m1,345s
user 0m0,086s
sys 0m0,034s
$ time sudo docker stop $(sudo docker run -dit --rm ubuntu:latest)
5512fb2505f28f7d2a52788a2ed9775c78ae40805da44e51bb3f22073133f19c
real 0m1,341s
user 0m0,075s
sys 0m0,048s
$ time sudo docker stop $(sudo docker run -dit --rm alpine:latest)
dc1775fa2734c753a5ba6f3fc0b14bf356376d8c701fcf6efa637f1795f41b4a
real 0m11,439s
user 0m0,089s
sys 0m0,032s
如何解释这种差异?
更新:时差仅由docker stop
产生。例如,如果我用docker stop -t 30
扩展超时,则alpine
容器将花费所有时间并最终超时,而其他容器的行为自然不受超时增加的影响。这似乎与SIGTERM的传播有关-我可以找到一些以前的问题,但它们通常与docker stop
有关,而与alpine
无关。这并不能解释为什么alpine
而不是其他图像存在此问题。
如果这是将高山linux映像与Python应用程序一起使用,则通常需要较长的时间来构建,尤其是使用较大的映像时。
[一个建议是剥离高山基础映像以减少慢速时间,因此删除最初安装的软件包,或者添加一个选项以不使用多阶段构建来缓存软件包下载也可以。
从docker stop
的文档中:
容器内的主进程将收到
docker stop
,并且在宽限期之后将收到SIGTERM
。
与使用SIGKILL
的CentOS,Debian和Ubuntu相对,Alpine使用bash
忽略了busybox sh
,并且仅在SIGTERM
超时后才停止容器。
与当前版本的SIGKILL
不同,后者尊重bash
并终止。但是,以前的SIGTERM
版本也忽略了bash
:使用较旧的CentOS映像(例如SIGTERM
)也会产生超时。
[最后,尚不清楚为什么centos:7
当前尊重bash
(请参阅SIGTERM
),或者为什么Why does SIGTERM work to terminate bash but not ash or dash?在本机系统上对SIGHUP
有用,但不适用于busybox sh
(请参阅docker kill
) 。