#Как выглядит неисправность
После docker run или docker compose up контейнер сразу переходит в Exited. Это не обязательно поломка Docker: контейнер обычно работает, пока жив основной процесс, указанный в ENTRYPOINT/CMD.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Основной процесс завершилсяВ образе запускается короткая команда, а не сервер | ExitCode=0 и нет ошибок | Запускать долгоживущий серверный процесс |
| Процесс завершился с ошибкойНе хватило настройки, файлов или библиотек | Ненулевой ExitCode и стек ошибки в logs | Исправить указанную первопричину |
#Пошаговое устранение
- 1. Найдите имя контейнераОткройте терминал Linux/macOS или PowerShell с работающим Docker и выполните docker ps -a. Найдите нужную строку по имени и времени создания; смотрите колонку STATUS. Если Docker сообщает permission denied, проверьте права доступа, не меняйте их глобально.Linux · Терминал (Bash)КомандаТолько чтение; показывает и остановленные контейнеры.
docker ps -a
- 2. Узнайте код и причину выходаПодставьте реальное имя вместо ИМЯ: docker inspect --format ... ИМЯ. ExitCode 0 обычно означает нормальное завершение команды; OOMKilled=true — возможную нехватку памяти; ненулевой код — сбой процесса.Linux · Терминал (Bash)КомандаТолько чтение; образец имени нужно заменить.
docker inspect --format '{{.State.Status}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}}' ИМЯ
- 3. Посмотрите начало и конец журналаЗапустите docker logs --tail 100 ИМЯ. Найдите конкретную ошибку: ENOENT, отказ подключения к БД или отсутствие переменной. Не публикуйте журнал без удаления паролей/токенов.Linux · Терминал (Bash)КомандаПоследние 100 строк, без изменения состояния.
docker logs --tail 100 ИМЯ
- 4. Проверьте главную команду образаПосмотрите docker inspect --format ... ИМЯ: Entrypoint и Cmd определяют процесс, жизнью которого управляет Docker. Если команда выполняет однократное действие и корректно завершается, статус Exited ожидаем; не подменяйте его sleep infinity.Linux · Терминал (Bash)КомандаТолько чтение конфигурации контейнера.
docker inspect --format '{{json .Config.Entrypoint}} {{json .Config.Cmd}}' ИМЯ
- 5. Исправьте причину на тестовой копииДля отсутствующего файла исправьте путь/WORKDIR в Dockerfile, для неверной команды запуска — ENTRYPOINT/CMD, для отсутствующей настройки — конфигурацию Compose. Пересоберите тестовый образ по инструкции проекта; не редактируйте напрямую файловую систему действующего контейнера.
- 6. Запустите пробную копию и проверьтеДля Compose из каталога проекта выполните docker compose config и затем docker compose up -d ТЕСТОВЫЙ_СЕРВИС после согласования имени. Проверьте docker compose ps и docker compose logs --tail 50 ТЕСТОВЫЙ_СЕРВИС; если статус снова Exited, вернитесь к ExitCode/журналу.Linux · Терминал (Bash)КомандаПроверка конфигурации и статуса; на разных версиях Compose имена сервиса отличаются.
docker compose configdocker compose ps
#Как проверить результат
Правильный результат: долгоживущая служба в состоянии Up и обслуживает запрос, а одноразовый контейнер завершается с ожидаемым кодом 0. При ненулевом коде исправляйте конкретное сообщение в logs.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.