Хоча я поважаю відповідь qkrijger, що пояснює, як можна обійти цю проблему, я думаю, що ми можемо дізнатися більше про те, що відбувається тут ...
Насправді відповісти на ваше запитання " чому " ... Я думаю, що вам було б корисно зрозуміти, як docker stop
працює команда, і що всі процеси повинні бути відключені чисто для запобігання проблем при спробі їх перезапустити (пошкодження файлів тощо).
Проблема: Що робити , якщо докер зробив запуск SSH від його команди і почав RabbitMQ з файлу Докер? " Команда докерної зупинки намагається спершу зупинити запущений контейнер шляхом надсилання сигналу SIGTERM кореневому процесу (PID 1) в контейнер. " Який процес відстежує докер як PID 1, який отримає SIGTERM? Це буде SSH чи Кролик ?? "Відповідно до моделі процесу Unix, процес init - PID 1 - успадковує всі діти-сироти і повинні їх повторно отримувати. Більшість контейнерів Docker не мають процесу init, який робить це правильно, і в результаті їх контейнери заповнюються зомбі-процеси з часом ".
Відповідь: Docker просто приймає , що останній CMD , як один , який буде запущений , як отримати кореневої процес з PID 1 та отримати SIGTERM від docker stop
.
Пропоноване рішення: Вам слід використовувати (або створити) базове зображення, створене спеціально для роботи декількох служб, таких як phusion / baseimage
Слід зазначити, що tini існує саме з цієї причини, а станом на Docker 1.13 і вище, tini офіційно є частиною Докера, що говорить нам, що запуск декількох процесів у Docker ВЕРІТАЛЬНИЙ .. так що навіть якщо хтось претендує на бути більш кваліфікованим щодо Докера і наполягати на тому, що ви абсурдні, думаючи це робити, знайте, що не є. Для цього існують цілком слушні ситуації.
Добре знати: