Як розслідувати основний процес, який загинув у докерній ємності?


13

Іноді доводиться досліджувати контейнер, який зупинився, або контейнер, який після запуску дуже швидко гине і зупиняється.

docker exec -ti <id> bash працює лише над запущеними контейнерами, після його закінчення також припиняється запит bash.

Якщо docker startви не можете подати іншу команду, і якщо контейнер різко вмирає, у вас не буде достатньо часу, щоб потрапити в контейнер і зробити ваші дослідження.

Ми можемо зробити docker commit, то docker runна новому зображенні з іншою командою, але мені цікаво , якщо є якісь - або інші альтернативи.

Примітка : docker logsпросто повертає всі програми, надруковані на stdout / stderr. Цього може бути недостатньо, щоб зрозуміти, в чому проблема.


Через деякий час поміркувавши над цим: основний процес Докера ???? Оскільки контейнер має на меті запускати лише один процес, або термін "основний" потрібно видалити, або ви робите щось дивне (наприклад, запуск процесу init), або ви приймаєте теми як процеси ... Я припускаю, що це Варіант перший, але я
мусив

@Tensibai іноді доводиться запускати щось на кшталт dumb-init, щоб обробляти питання pid 1 / сигналізація в контейнерах, якщо ваша основна команда не може сама впоратися. Можуть бути й інші випадки, коли контейнер
docker

Так, це я називаю дивним, головним чином тому, що контейнери були зроблені для ізоляції процесу. Іноді контейнери не є рішенням для програми, яка бажає помістити все в контейнер - це швидше шлях до головного болю, ніж все інше.
Тенсібай

Відповіді:


9

Загальні способи відстеження, чому процес в Linux не вдався, хороші. Один із таких способів - запустити процес, використовуючи straceякий підкаже процес системних викликів і зазвичай вказує на причину збою.

Ви можете створити такий, Dockerfileякий виглядає приблизно так:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

Потім запустіть нове зображення, використовуючи docker run debug_version strace original_cmd.

Для процесів, вилочні діти (і потім померти) ви хочете запустити straceз -ffопцією. Ви також можете зіставити деякий файл за допомогою томів даних Docker і скористатись -oопцією " straceнаписати" до нього. Але загалом straceвийде вихід на stdout, який читається за допомогою docker log.

Пов'язані питання: Процес Linux таємно закінчується


Це означає, що я все-таки повинен спочатку docker commitзупинитися на своєму контейнері, щоб мати зображення для початку
SztupY

Ви сказали, що помирає на старті. Я припускаю, що у вас тоді є образ. Для тих, хто зупиняється, так, необхідна фіксація.
Євгеній

Це лише один із сценаріїв отримання контейнера, що зупинився
SztupY

Також є пакет для straceAlpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Використовуйте менеджер пакетів Alpine , щоб встановити його, apk install strace.
Євгеній

3

Наскільки мені відомо, commitі runнайкращі варіанти тут надати вам повний доступ до контейнера, як це було, коли він загинув.

В ідеалі ваш контейнер випхав би ще корисну інформацію, коли він не працює, але це зовсім інша тема.

Редагувати: щоб розширити свою відповідь, якщо контейнер вмирає прямо під час запуску, ви також docker runможете вказати альтернативу --entrypointта CMD. Як правило, я встановлю це цикл або щось, що не вийде самостійно. Після того, як ви знаходитесь в контейнері, ви можете вручну виконати кроки, які виходять з ладу, а потім перевірити результат, не турбуючись про вихід контейнера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.