Удаленная отладка с XDebug изнутри Docker Container не работает

Я пытаюсь настроить докционированную среду AMP и не могу заставить удаленный отладчик работать. Моя настройка такова:

У меня есть контейнер базы данных, в котором работает mysql, который работает как шарм. Я создал изображение Docker 'phpmysqli' со следующим Dockerfile

FROM php:apache

RUN docker-php-ext-install mysqli mbstring

# zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
RUN pecl install xdebug
RUN echo 'zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so' >> /usr/local/etc/php/php.ini
RUN touch /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_enable=1 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_autostart=0 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_connect_back=1 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_port=9000 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_log=/tmp/php5-xdebug.log >> /usr/local/etc/php/conf.d/xdebug.ini;

RUN echo 'date.timezone = Europe/Berlin' > /usr/local/etc/php/conf.d/date.ini

Я звоню

docker run --rm -ti  --name web -p 127.0.0.1:8080:80 -v /path/to/projects:/var/www/html --link db:db  phpmysqli

После этого phpinfo соответственно php -i показывает, что xdebug 2.3.2 запущен и работает.

Далее я настраиваю сервер внутри IntelliJ IDEA с именем "Docker" с хостом 127.0.0.1, портом 8080 и отладчиком Xdebug. Я настраиваю сопоставление пути, аналогичное отображению томов в инструкции запуска docker.

В настройках PHP- > Debug я проверил, что для входящих подключений я использую порт 9000, что я буду принимать внешние подключения и что я не буду игнорировать подключения с незарегистрированных серверов.

После этого я создал новую конфигурацию удаленной отладки PHP под названием Docker. Сервер - Docker, идентификатор сеанса - XDEBUG_IDEA.

Я могу вызывать файлы PHP в контейнере, я могу подключиться к db по ссылке... но по какой-то причине ничего не происходит, когда я пытаюсь запустить сеанс отладки. Я попытался использовать cookie (и да, я установил XDEBUG_IDEA как идентификатор сеанса в xdebug helper). Я попытался отправить XDEBUG_SESSION_START=XDEBUG_IDEA как GET...

Можете ли вы умные люди сказать мне, что я пропустил?

Ответы

Ответ 1

Вы можете попробовать с этой конфигурацией. php-apache build предоставляет два метода для компиляции и включения модуля php. Лучше использовать docker-php-ext-enable xdebug для установки правильной конфигурации файла.

FROM php:5.4-apache

# Enable and configure xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN sed -i '1 a xdebug.remote_autostart=true' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_mode=req' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_handler=dbgp' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_connect_back=1 ' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_port=9000' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_host=127.0.0.1' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_enable=1' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

Ответ 2

Для меня в среде PHP, NGINX Docker, использующей Sublime, я настроил ее на следующие настройки:

xdebug.remote_enable = 1
xdebug.remote_mode = req
xdebug.remote_port = 9001
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal

Единственное, что заставило меня задуматься, - это установить remote_host в host.docker.internal.

Ответ 3

закрыть: xdebug.remote_connect_back=0 добавить: xdebug.remote_host=192.168.0.102[your docker host/machine IP]

Ответ 4

Если вы не хотите изменять конфигурацию xdebug в контейнере и хотите, чтобы она работала с использованием xdebug.remote_connect_back=1, вы можете установить для HTTP-заголовка X-Forwarded-For IP-адрес host.docker.internal и, таким образом, определить PHP $_SERVER['HTTP_X_FORWARDED_FOR'], который предпочитает xdebug и использует в качестве клиента IP вместо $_SERVER['REMOTE_ADDR'].