Глиф Учебники

Контейнер сразу останавливается

Справочник · Docker · 2 минуты чтения

Сначала посмотрите состояние и вывод программы:

Bash
docker ps -a
docker logs имя-контейнера

В столбце STATUS у остановленного контейнера — Exited (код). Код выхода и последние строки лога почти всегда сразу называют причину.

Что значит состояние

Причина зависит от того, что написано в STATUS:

Exited (0)программа просто закончила работу

Контейнер живёт, пока работает его основная программа. Код 0 значит, что она завершилась без ошибок — ей больше нечего делать.

  • Образ системы без команды. docker run -d ubuntu:24.04 запускает bash, а bash без терминала сразу завершается. Для работы внутри нужен терминал: docker run -it ubuntu:24.04 bash. Если контейнер просто должен висеть в фоне (например, для опытов), дайте ему бесконечную команду: docker run -d --name test ubuntu:24.04 sleep infinity.
  • Программа ушла в фон. Сервисы, которые по привычке «демонизируются» (уходят в фон и отдают управление), в контейнере так работать не должны: основной процесс завершился — контейнер остановился. В Dockerfile такие программы запускают в режиме переднего плана — у Nginx это nginx -g 'daemon off;', у других программ смотрите ключ вроде --foreground или -D FOREGROUND.
  • Это задача, а не сервис. Скрипт отработал и закончился — так и задумано.

Дальше: «Как заглянуть внутрь»

Exited (1) и другие кодыошибка программы

Читайте docker logs: программа обычно пишет, что ей не понравилось. Частые причины:

  • не задана обязательная переменная — например, образ postgres без POSTGRES_PASSWORD или mariadb без пароля root сразу завершаются с подсказкой в логе;
  • ошибка в файле настроек, подключённом с хоста;
  • нет прав на подключённую папку — в логе Permission denied;
  • не найдена программа — опечатка в CMD или в команде после имени образа; в выводе docker run будет executable file not found.

Дальше: «Как заглянуть внутрь»

Exited (137)процесс убит

Код 137 значит, что процесс завершили принудительно (сигнал KILL). Обычно это:

  • нехватка памяти — контейнер упёрся в лимит --memory или на хосте закончилась память. Проверка: docker inspect --format '{{.State.OOMKilled}}' имя-контейнера — true значит, что процесс убило ядро из-за памяти;
  • docker stop не дождался — программа не завершилась за 10 секунд, и Docker остановил её принудительно.

Код 143 — процесс завершился по сигналу TERM, то есть его штатно остановили.

Дальше: «Как заглянуть внутрь»

Restartingпадает снова и снова

Если у контейнера политика перезапуска (--restart), он падает и поднимается по кругу; в docker ps видно Restarting. Причина та же — ищите её в логах:

Bash
docker logs --tail 50 имя-контейнера

Чтобы спокойно разобраться, остановите круг: docker update --restart no имя-контейнера, затем docker stop имя-контейнера.

Как заглянуть внутрь

В упавший контейнер нельзя зайти через docker exec. Запустите из того же образа одноразовый контейнер с оболочкой вместо обычной команды и проверьте файлы и настройки руками:

Bash
docker run -it --rm --entrypoint sh образ

Подключите те же тома и папки (-v …), что у упавшего контейнера, — тогда увидите ровно то, что видит программа.