Docker LinuxWindowsmacOS

Docker Compose: service exited with code 1 — как найти причину

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Сервис завершился с ошибкой. Смотрите docker compose logs, проверьте переменные окружения, зависимости и порядок запуска.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Логи и состояние
  5. Типичные причины
  6. Ресурсы и платформа

#Что означает ошибка

Сообщение
exited with code 1

Сообщение «exited with code 1» в docker compose значит, что основной процесс контейнера завершился с ошибкой. Сам Docker здесь не виноват: нужно читать вывод приложения внутри контейнера. Код 1 — общий признак ошибки, а коды 137 и 139 указывают на нехватку памяти и segfault.

Первое действие — посмотреть логи сервиса.

Дальше определить, падает ли контейнер сразу или после работы.

Сервис завершился с ошибкой. Смотрите docker compose logs, проверьте переменные окружения, зависимости и порядок запуска.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Ошибка приложенияКод.Выход 1.Логи.
Нет переменных.env.Выход.Задайте.
БД не готоваПорядок.Выход.healthcheck.
Нет файлаТом.Выход.Проверьте.

#Пошаговое решение

  1. Прочитайте логи сервисаВ каталоге с compose.yaml откройте терминал и выполните docker compose ps -a: найдите сервис со статусом Exited (1). Затем docker compose logs --tail=100 --timestamps имя_сервиса, подставив точное имя из файла Compose (не имя контейнера). Прочитайте первые конкретные сообщения до строки об остановке: там часто находятся причины — отсутствие переменной, ошибки БД, файла, разрешений. Скопируйте диагностические строки, исключив пароли и ключи.
  2. Запустите контейнер интерактивноЕсли лог заканчивается без подробной ошибки, посмотрите docker compose config и docker compose ps -a, затем выясните, какую команду сервис должен запускать. Для тестовой среды можно запустить контейнер с отдельной оболочкой docker compose run --rm --entrypoint sh имя_сервиса, если образ содержит sh. Однако run может запустить дополнительное приложение и не наследует все настройки публикации портов; не используйте этот способ на рабочей БД и очереди без понимания последствий.
  3. Проверьте переменные окружения и томаОткройте compose.yaml и относящийся к нему .env в редакторе. Проверьте значения переменных, пути к томам, существование файлов конфигурации и права пользователя процесса внутри контейнера. Команда docker compose config показывает развёрнутую конфигурацию и может раскрывать секреты, поэтому не публикуйте полный вывод. Если ошибка Permission denied, исправляйте владельца только конкретного каталога после сверки UID/GID, а не через chmod 777.
  4. Настройте порядок запускаЕсли ошибка связана с БД, которая ещё не успевает начать принимать подключения, отдельно проверьте docker compose logs db и docker compose ps. Простое depends_on управляет порядком запуска, но не всегда готовностью сервиса; для подходящих сервисов настройте корректный healthcheck и условие service_healthy согласно поддерживаемому синтаксису Compose. Повторите проверку после пересоздания только нужных сервисов, а не всех контейнеров сервера.
  5. Проверьте код выходаВ docker compose ps -a проверьте настоящий код выхода. 1 — общее завершение приложения с ошибкой; 137 часто связан с SIGKILL (включая нехватку памяти), а 139 — с SIGSEGV, но это не полный диагноз. Для подозрения на OOM посмотрите docker inspect для конкретного контейнера и системные журналы ядра, а не увеличивайте память вслепую. После исправления первопричины выполните docker compose up -d имя_сервиса и посмотрите новые логи.

#Логи и состояние

Выполните docker compose logs --tail=100 имя_сервиса и docker compose ps -a. Для подробностей: docker inspect --format='{{.State.ExitCode}} {{.State.Error}}' контейнер. Если логи пустые, проверьте command/entrypoint в файле: неверный путь к скрипту даёт мгновенный выход. Запустите интерактивно: docker compose run --rm --entrypoint sh сервис, затем вручную запустите команду приложения.

#Типичные причины

Нет переменных окружения (.env не подхвачен или не указан env_file). Сервис стартует раньше базы данных: добавьте depends_on с condition: service_healthy и healthcheck. Занят порт (bind: address already in use). Нет прав на примонтированный том. Ошибка конфигурации приложения (неверный DSN, отсутствует файл). Для сборок проверьте docker compose build --no-cache.

#Ресурсы и платформа

Код 137 — убит по памяти (OOM): docker stats, увеличьте лимит mem_limit или память Docker Desktop. На Apple Silicon образ amd64 может падать: укажите platform: linux/amd64. На Windows с WSL2 проверьте окончания строк в скриптах (dos2unix script.sh), иначе будет ошибка exec format error или no such file.

Linux · Терминал (Bash)С осторожностью
Интерактивный запуск — отдельный вариант диагностики, не безусловный шаг для рабочей БД
# Из каталога соответствующего Compose-проекта
docker compose ps -a
# Подставьте реальное имя службы из compose.yaml вместо app
docker compose logs --tail=100 --timestamps app
# Для тестового окружения: docker compose run --rm --entrypoint sh app

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.