Контейнер сразу останавливается
Сначала посмотрите состояние и вывод программы:
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. Причина та же — ищите её в логах:
docker logs --tail 50 имя-контейнераЧтобы спокойно разобраться, остановите круг: docker update --restart no имя-контейнера, затем docker stop имя-контейнера.
Как заглянуть внутрь
В упавший контейнер нельзя зайти через docker exec. Запустите из того же образа одноразовый контейнер с оболочкой вместо обычной команды и проверьте файлы и настройки руками:
docker run -it --rm --entrypoint sh образПодключите те же тома и папки (-v …), что у упавшего контейнера, — тогда увидите ровно то, что видит программа.