Иногда вам нужно исследовать контейнер, который остановлен, или контейнер, который после запуска очень быстро умирает и останавливается.
docker exec -ti <id> bash
работает только на запущенных контейнерах, после его завершения приглашение bash также завершается.
При этом docker start
вы не можете предоставить другую команду, и если контейнер снова внезапно умирает, у вас не будет достаточно времени, чтобы войти в контейнер и провести расследование.
Мы можем сделать docker commit
, то docker run
на новом образе с другой командой, но мне интересно, есть ли какие-либо другие альтернативы.
Примечание : docker logs
просто возвращает все напечатанные приложения в stdout / stderr. Этого может быть недостаточно, чтобы понять, в чем проблема.
docker
containers
post-mortem
SztupY
источник
источник
Ответы:
Общие способы отследить, почему процесс в Linux вышел из строя, хороши. Одним из таких способов является запуск процесса,
strace
который сообщит вам, что делал системный вызов, и обычно указывает на причину сбоя.Вы можете создать
Dockerfile
что-то вроде этого:Затем запустите новое изображение, используя
docker run debug_version strace original_cmd
.Для процессов, которые разветвляют потомков (а затем умирают), вы хотите запустить
strace
с-ff
опцией. Вы также можете сопоставить некоторый файл с помощью томов данных Docker и использовать-o
опциюstrace
для записи в него. Но в общемstrace
случае выходной поток останется на stdout, который можно прочитать с помощьюdocker log
.Связанный вопрос : процесс Linux загадочно завершается
источник
docker commit
сначала остановить свой контейнер, чтобы иметь изображение для запускаstrace
Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Используйте менеджер пакетов Alpine для его установкиapk install strace
.Насколько я знаю,
commit
и здесьrun
есть лучшие варианты, чтобы дать вам полный доступ к контейнеру, каким он был, когда он умер.В идеале, ваш контейнер будет выдавать некоторую полезную информацию, когда он выйдет из строя, но это совсем другая тема.
Изменить: чтобы расширить мой ответ, если контейнер умирает прямо при запуске, вы также можете использовать,
docker run
чтобы указать альтернативу--entrypoint
иCMD
. Обычно я устанавливаю это в цикл или что-то, что само по себе не выходит. После того, как вы окажетесь в контейнере, вы можете вручную выполнить неудачные шаги, а затем проверить результат, не беспокоясь о выходе из контейнера.источник