Как исследовать основной процесс, который умер в контейнере докера?

13

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

docker exec -ti <id> bash работает только на запущенных контейнерах, после его завершения приглашение bash также завершается.

При этом docker startвы не можете предоставить другую команду, и если контейнер снова внезапно умирает, у вас не будет достаточно времени, чтобы войти в контейнер и провести расследование.

Мы можем сделать docker commit, то docker runна новом образе с другой командой, но мне интересно, есть ли какие-либо другие альтернативы.

Примечание : docker logsпросто возвращает все напечатанные приложения в stdout / stderr. Этого может быть недостаточно, чтобы понять, в чем проблема.

SztupY
источник
Через некоторое время задумался: Docker основной процесс ???? Поскольку контейнер нацелен на запуск только одного процесса, необходимо удалить термин «main», или вы делаете что-то странное (например, запуск процесса init), или вы воспринимаете потоки как процессы ... Я предполагаю, что это
Первый
@Tensibai иногда вам нужно запустить что-то вроде dumb-init, чтобы обработать проблему pid 1 / signaling в контейнерах, если ваша основная команда не может обработать это сама. Могут быть и другие случаи, когда док-контейнер выполняет более одного процесса
SztupY
Да, это то, что я называю странным, главным образом потому, что контейнеры были сделаны для изоляции процесса. Иногда контейнеры не являются решением для приложения, а желание поместить все в контейнер - это скорее путь к головной боли, чем что-либо еще.
Тенсибай

Ответы:

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. Обычно я устанавливаю это в цикл или что-то, что само по себе не выходит. После того, как вы окажетесь в контейнере, вы можете вручную выполнить неудачные шаги, а затем проверить результат, не беспокоясь о выходе из контейнера.

tayworm
источник