Короткий ответ
Код выхода 137 = 128+9, то есть процесс получил сигнал SIGKILL; чаще всего это OOM kill от cgroup при превышении лимита --memory, что подтверждается полем OOMKilled: true в docker inspect.
Как это работает подробнее
когда процесс внутри контейнера превышает лимит памяти cgroup, ядро Linux принудительно завершает его сигналом SIGKILL (OOM killer), и Docker фиксирует соответствующий код выхода и флаг в метаданных контейнера. Если при этом задана политика restart (--restart=on-failure или always), Docker сразу перезапускает контейнер, который снова упирается в тот же лимит и падает — внешне это выглядит как бесконечный цикл перезапусков.
Пример кода
Пример конфигурации
$ docker inspect app --format '{{json .State}}' | jq
{
"Status": "exited",
"ExitCode": 137,
"OOMKilled": true,
"Error": ""
}
$ dmesg | grep -i "killed process"Что использовать на практике
- Практика. первым шагом смотрят
docker inspect --format '{{json .State}}' CONTAINER— наличие"OOMKilled": trueподтверждает причину. Далее нужно понять, действительно ли приложению не хватает заданного лимита (тогда разумно его увеличить и профилировать потребление памяти), либо это утечка памяти в самом приложении (тогда увеличение лимита лишь отложит проблему).
Подводные камни
- Риск. сразу увеливают
--memory"чтобы заработало", не проверив, не является ли рост потребления памяти утечкой; путают OOM kill ядра cgroup с ошибкой уровня приложения (например, необработанным исключением), хотя код 137 специфично указывает именно на внешнийSIGKILL.