Отладка кода в docker-контейнере из NetBeans

· netbeans xdebug php docker

Я уже немного писал о NetBeans тут . Данная IDE умеет хорошо дружить с Xdebug, в связке с которым очень удобно отлаживать php-код. Основы успешно описаны, например, здесь.

Все интереснее, когда код приходится отлаживать не на локальной машине, а внутри docker-контейнера. Особенно, если нужно отладить cli-скрипт внутри контейнера.

Для успешной отладки следует:

  1. Настроить docker-контейнер с Xdebug внутри;
  2. Настроить Xdebug внутри контейнера;
  3. Настроить NetBeans.

При обычной отладке с использованием браузера и при отладке cli-скрипта настройки будут слегка отличаться. Итак, поехали.

Настройка контейнера

Установку Xdebug внутрь контейнера мы обсуждать не будем. Эти настройки можно найти, например, тут.

Интереснее настройки самого Xdebug.

В случае с обычной отладкой:

xdebug.remote_enable=1
xdebug.remote_connect_back=1 
xdebug.idekey=netbeans-xdebug

Расшифровка:

  • xdebug.remote_enable — разрешает удаленную отладку.
  • xdebug.remote_connect_back — автоматическое установление соединения с хостом, который иницирует удаленную отладку. Если не указывать эту опцию, то нужно использовать xdebug.remote_host, где следует указать ip вашего хоста из виртуального docker-адаптера.
  • xdebug.idekey — ключ для соединения. Значение netbeans-xdebug задано в NetBeans по умолчанию. Можно не задавать эту опцию и использовать xdebug.remote_autostart=1, но тогда Xdebug будет стартовать в каждом скрипте, даже если это не нужно, что скажется на производительности.

Настройка NetBeans

Для успешной отладки NetBeans должен знать как сопоставить между собой пути внутри docker-контейнера и пути в хостовой машине.

Идем в Свойства проекта, далее Выполнить настройку → Дополнительно. Внизу в разделе Отображение пути добавляем наше сопоставление.

Теперь, если запустить отладку проекта, то отладчик должен автоматически остановить выполнение на первой строке скрипта точки входа в приложение (если активирована соответствующая настройка в IDE).

Если ничего не произошло и вас отключена опция NetBeans Остановить в первой строчке, то удостоверьтесь, что поставили breakpoint где-то по пути выполнения скрипта. Если ни одного breakpoint не установлено, то следует установить его, остановить отладку и запустить снова.

Отладка cli-скрипта

Для отладки cli-скрипта все немного иначе. Главное отличие в том, что опция xdebug.remote_connect_back=1 нам не нужна, ведь соединения от хостовой машины не будет. Вместо этого NetBeans будет ожидать обращений от приложения.

Для начала настроим NetBeans.

Идем по уже известному пути Свойства проекта → Выполнить настройку. Здесь добавляем новую конфигурацию, нажав Создать…. Далее жмем Дополнительно и указываем опцию Не открывать браузер.

После настройки, кликаем правой кнопкой по проекту, выбираем Установить конфигурацию и задаем вариант, который только что создали.

Теперь можно нажать Отладка проекта или просто Ctrl+F5. Браузер не должен открыться.

Идем в меню Окно → IDE и сервис → Терминал. В появившемся терминале выполняем вход в docker-контейнер, выполнив что-то вроде:

$ docker exec -ti %container_id% bash

%container_id% в данном случае id контейнера с вашим приложением.

Теперь самое интересное. Выполняем:

$ export XDEBUG_CONFIG="remote_enable=1 remote_mode=req remote_port=9000 remote_host=%remote_host_ip% remote_connect_back=0 idekey=netbeans-xdebug"

Обратите внимание на указанный remote_host. Именно по этому адресу Xdebug будет ломиться в отладчик. Проставьте свое значение на место %remote_host_ip%.

Теперь можно запустить какой-нибудь cli-скрипт. Например, миграции yii:

$ ./yii migrate

Если отладчик NetBeans запущен, то он должен отловить это событие и прервать выполнение на первой строке скрипта точки входа.