运行和停止Alpine Docker容器所需的时间大约是CentOS、Debian或Ubuntu的10倍

运行和停止Alpine Docker容器所需的时间大约是CentOS、Debian或Ubuntu的10倍,docker,ubuntu,centos,signals,alpine,Docker,Ubuntu,Centos,Signals,Alpine,我使用不同的Docker图像来运行代码,并注意到以下几点: $time sudo docker stop$sudo docker run-dit-rm centos:latest 509285200bcf4ea8389219319b6c4af6554abf9f1c9d9ffb152cd109b6a21453 真正的0M1374S 用户0M0087S 系统0M0027S $time sudo docker stop$sudo docker run-dit-rm debian:latest 2212

我使用不同的Docker图像来运行代码,并注意到以下几点:

$time sudo docker stop$sudo docker run-dit-rm centos:latest 509285200bcf4ea8389219319b6c4af6554abf9f1c9d9ffb152cd109b6a21453 真正的0M1374S 用户0M0087S 系统0M0027S $time sudo docker stop$sudo docker run-dit-rm debian:latest 221221221B4B9238DE633CA68D9539B024C06D015EA503A8B7FD5B827DC903193B8 真正的01345s 用户0M0086S 系统0M0034S $time sudo docker stop$sudo docker run-dit-rm ubuntu:最新版本 5512FB2505F28F7D2A52788A2ED9775C78AE40805DA44E51BB3B3F22073133F19C 实数0m1341s 用户0M0075S 系统0M0048S $time sudo docker stop$sudo docker run-dit-rm alpine:最新版本 dc1775fa2734c753a5ba6f3fc0b14bf356376d8c701fcf6efa637f1795f41b4a 真正的0M11439S 用户0M0089S 系统0M0032S 如何解释这种差异


更新:时差完全由docker stop产生。例如,如果我使用docker stop-t 30延长超时时间,alpine容器将占用所有时间并最终超时,而其他容器的行为自然不会受到超时时间增加的影响。这似乎与SIGTERM的传播有关——我可以找到一些以前的问题,但它们通常是关于docker stop的,而不是关于alpine的。这并不能解释为什么alpine而不是其他映像存在此问题。

如果将alpine linux映像与Python应用程序一起使用,则众所周知,构建此映像需要较长的时间,尤其是对于较大的映像


一个建议是剥离alpine base image安装,以减少低速时间,因此删除最初安装的软件包,或者添加一个选项,不使用多阶段构建缓存软件包下载,也可以使用此选项。

如果将alpine linux映像与Python应用程序一起使用,众所周知,它需要更长的时间来构建,尤其是使用更大的图像

一个建议是剥离alpine base image安装,以减少低速时间,因此删除最初安装的软件包,或者可能添加一个选项,不使用多阶段构建缓存软件包下载,也可以使用。

来自以下文档:

容器内的主进程将接收SIGTERM,在一段宽限期后,接收SIGKILL

与CentOS、Debian和Ubuntu使用bash不同,Alpine使用busybox sh忽略SIGTERM,容器仅在SIGKILL超时后停止

这与当前版本的bash不同,后者使用SIGTERM并终止。然而,bash的早期版本也忽略了SIGTERM:使用较旧的CentOS映像(如CentOS:7)也会产生超时

最后,还不清楚为什么bash目前支持SIGTERM see,或者为什么SIGHUP在本机系统上为busybox sh工作,但不支持docker kill see。

来自以下文档:

容器内的主进程将接收SIGTERM,在一段宽限期后,接收SIGKILL

与CentOS、Debian和Ubuntu使用bash不同,Alpine使用busybox sh忽略SIGTERM,容器仅在SIGKILL超时后停止

这与当前版本的bash不同,后者使用SIGTERM并终止。然而,bash的早期版本也忽略了SIGTERM:使用较旧的CentOS映像(如CentOS:7)也会产生超时


最后,还不清楚为什么bash目前支持SIGTERM see,或者为什么SIGHUP在本机系统上为busybox sh工作,但不支持docker kill see。

非常有趣的发现!我可以在Ubuntu 16.04.6上复制。根据你的发现,我可以复制:Docker版本18.09.7、build 2d0083d、Docker版本19.03.6、build 369ce74a3cSure thing@fineroot和kodus。还复制了不同的alpine图像:3.11、3.10和3.9,以及gliderlabs/alpine:3.9和gliderlabs/alpine:3.7,其中Dockerfiles可用。我怀疑问题与alpine使用的musl libc及其信号处理有关,但这只是一种推测。我添加了[signals]标签,希望它能传到右眼。很好!非常有趣的发现!我可以在Ubuntu 16.04.6上复制。根据你的发现,我可以复制:Docker版本18.09.7、build 2d0083d、Docker版本19.03.6、build 369ce74a3cSure thing@fineroot和kodus。还复制了不同的alpine图像:3.11、3.10和3.9,以及gliderlabs/alpine:3.9和gliderlabs/alpine:3.7,其中Dockerfiles可用。我怀疑问题与alpine使用的musl libc及其信号处理有关,但这只是一种推测。我添加了[signals]标签,希望它能传到右眼。很好!很好,这里讨论的图像是纯Linux基础图像。@FishingCode嘿,谢谢!是的,在研究这个问题的时候,我也读了很多这方面的文章。我不确定这和贝壳有关。但当然,可能是这样。没有再往里看
对此:所讨论的图像是纯Linux基础图像。@FishingCode嘿,谢谢!是的,在研究这个问题的时候,我也读了很多这方面的文章。我不确定这和贝壳有关。但当然,可能是这样。没有进一步调查那件事