Удаленная отладка с 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']
.