在Docker容器中使用XDebug进行远程调试是不工作的


Remote Debugging with XDebug from inside a Docker Container does not work

我正在尝试设置一个停靠的AMP环境,无法获得远程调试器工作。我的设置如下:

我有一个数据库容器运行mysql这是一个魅力。我用以下Dockerfile

构建了一个Docker映像'phpmysqli'
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运行语句中设置了类似于Volume映射的路径映射。

PHP->调试设置我检查了我使用端口9000的传入连接,我将接受外部连接,我不会忽略未注册服务器的连接。

之后,我创建了一个新的PHP远程调试配置名为Docker。Server是Docker, session id是XDEBUG_IDEA

我可以在容器上调用PHP文件,我可以通过链接连接到数据库…但是由于某种原因,当我尝试启动调试会话时,什么都没有发生。我尝试使用cookie(是的,我将XDEBUG_IDEA设置为xdebug helper中的会话id)。我尝试将XDEBUG_SESSION_START=XDEBUG_IDEA发送为GET

你们这些聪明人能告诉我我错过了什么吗?

您可以尝试使用这个配置。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

对于我来说,在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。

close: xdebug.remote_connect_back=0add: xdebug.remote_host=192.168.0.102[your docker host/machine IP]

如果您不想在容器中更改xdebug配置,并希望使用xdebug.remote_connect_back=1使其工作,您可以将HTTP-Header X-Forwarded-For设置为host.docker.internal的IP,从而定义PHP $_SERVER['HTTP_X_FORWARDED_FOR'], xdebug更喜欢并使用作为客户端IP而不是$_SERVER['REMOTE_ADDR']

在Docker 20.10+中,Xdebug同时适用于Ubuntu和MacOS用户,使用以下反直觉的配置:

xdebug.client_host=host.docker.internal
xdebug.discover_client_host=true

使用PhpStorm测试。用于构建具有网络特性和Xdebug功能的基于PHP7+ debian的容器,无论您运行的是什么操作系统(也可能是Windows,但还没有尝试)