Запуск и остановка контейнера Alpine Docker занимает в 10 раз больше времени, чем CentOS, Debian или Ubuntu. - PullRequest
1 голос
/ 02 марта 2020

Я использую разные 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, а не для других изображений.

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Из документов на docker stop:

Основной процесс внутри контейнера получит SIGTERM, а после льготного периода SIGKILL.

В отличие от CentOS, Debian и Ubuntu, которые используют bash, Alpine использует busybox sh, который игнорирует SIGTERM, и контейнер останавливается только по истечении времени ожидания с SIGKILL.

Это отличается от текущих версий bash, которые соблюдают SIGTERM и заканчиваются. Тем не менее, предыдущие версии bash тоже игнорировали SIGTERM: использование более старого образа CentOS, такого как centos:7, также приводит к тайм-ауту.

В конце, неясно, почему bash в настоящее время учитывает SIGTERM (см. Почему SIGTERM работает для завершения bash, но не sh или da sh? ) или почему SIGHUP работает на busybox sh в собственной системе, но не с docker kill (см. Почему SIGHUP не работает на busybox sh в контейнере Alpine Docker? ).

1 голос
/ 02 марта 2020

Если используется альпийское linux изображение с Python приложениями, известно, что для его создания требуется больше времени, особенно с большими изображениями.

Одно из предложений - убрать установку базового образа Alpine, чтобы уменьшить время медленной скорости, поэтому удалите изначально установленные пакеты или, возможно, добавьте возможность не кэшировать загрузки пакетов с помощью многоступенчатой ​​сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...