логотип PurpleSchool
логотип PurpleSchool

Коды выхода в Docker - значение и использование

Автор

Алексей Смирнов

Введение

Коды выхода — это важная часть работы с Docker-контейнерами и любых процессов в операционных системах. Эти коды отражают статус завершения процесса и помогают определить, успешно ли он выполнен или возникли какие-либо ошибки. Понимание и правильная интерпретация кодов выхода может значительно упростить диагностику и отладку приложений, запущенных внутри контейнеров.

В этой статье мы рассмотрим, как коды выхода используются в Docker, какие значения они могут принимать и как их эффективно использовать для улучшения контроля над вашими контейнерами.

Коды выхода в Docker

Что такое коды выхода?

Когда процесс завершается, он возвращает числовой код, называемый кодом выхода (exit code), который указывает на результат его выполнения. В контексте Docker, коды выхода контейнера показывают, почему он завершился, и помогают пользователю оценить успешность выполнения контейнеризованного приложения.

Коды выхода можно использовать для автоматизации и управления приложениями. Например, они часто применяются в сценариях CI/CD для определения того, была ли сборка успешной.

Основные значения кодов выхода

Наиболее часто встречающиеся коды выхода в Docker следующие:

  • 0: Индикатор успешного завершения. Это означает, что процесс завершился без ошибок.

  • 1-125: Ошибки, которые произошли в процессе. Обычно они указывают на то, что контейнерное приложение завершилось с ошибкой.

  • 126: Команда не может быть выполнена (например, отсутствует разрешение).

  • 127: Команда не найдена, что часто указывает на ошибку в написании команды или отсутствующих исполняемых файлах в системе.

  • 137: Контейнер был остановлен из-за сигнала SIGKILL, что может произойти из-за превышения лимита памяти.

  • 139: Контейнер завершился из-за сегментационной ошибки SIGSEGV, связанной с неправильным доступом к памяти процесса.

  • 143: Контейнер завершился из-за сигнала SIGTERM, что часто происходит, когда контейнер завершался намеренно или его попросили завершиться корректно.

  • 137: Контейнер был завершен сигналом SIGKILL, что часто связано с превышением лимита памяти или целенаправленным завершением процесса.

Каждое из этих значений может указать на разные типы проблем, связанных с выполнением контейнера. Давайте теперь рассмотрим, как на практике можно использовать коды выхода Docker.

Использование кодов выхода в Docker

Просмотр кода выхода контейнера

Чтобы получить код выхода контейнера, вы можете воспользоваться следующей командой Docker:

docker inspect <container_id> --format='{{.State.ExitCode}}'

// Здесь команда inspect используется для извлечения информации о состоянии контейнера. // --format позволяет вывести только код выхода, специфичный для данного контейнера.

Эта команда вернет код, с которым контейнер завершился. Зная это, вы можете принимать решения по дальнейшим действиям, таких как рестарт контейнера либо анализ логов для выяснения причин ошибок.

Применение в сценариях CI/CD

Коды выхода широко применяются в автоматизированных сценариях CI/CD. Если контейнер завершается с ненулевым кодом выхода, это сигнализирует о сбое сборки или теста, и необходимо предпринять меры по исправлению.

Пример shell-скрипта, который повторно запускает контейнер, если он завершился с ненулевым кодом выхода:

container_id=$(docker run -d my-application)
exit_code=$(docker wait $container_id)

if [ $exit_code -ne 0 ]; then
  echo "Контейнер завершился с ошибкой. Код выхода: $exit_code"
  # Здесь можно добавить логику повторного запуска или уведомления
fi

В этом простом примере контейнер запускается, и при завершении считывается его код выхода. Если код не равен нулю, система оповещает о сбое.

Диагностика и исправление ошибок на основе кодов выхода

Коды выхода могут не только указывать на факт возникновения ошибки, но и направлять вашу диагностику в нужное русло. Например:

  • 127 может указывать на то, что контейнеру не хватает необходимые зависимости. Проверьте, установлены ли все потребные пакеты.

  • 137 может означать превышение лимита памяти или использование команды kill -9. Рассмотрите возможность увеличения ресурсов для контейнера.

  • 139 сигнализирует о проблемах в коде, которые приводят к сегментационной ошибке. Пользуйтесь отладчиком для выяснения причин таких ошибок.

Заключение

Коды выхода в Docker — это мощный инструмент, который помогает диагностировать проблемы и автоматизировать управление контейнерами. Понимание значений кодов выхода и умение использовать их в различных сценариях может существенно повысить вашу продуктивность при работе с контейнерами. Независимо от того, встречаетесь ли вы с ошибками при разработке или интеграции, коды выхода помогут вам понять, что пошло не так, и как это исправить.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile