在php-fpm docker容器中配置xdebug



我基本上使用此配置为Symfony Project创建开发环境https://github.com/maxpou/docker-symfony。它运行,但我无法让Xdebug工作:设置断点时不会停止。

我还试图配置Xdebug以使用Connect_back,但这不起作用。也许这与我在Windows机器上开发的事实有关?任何见解都非常感谢。

Dockerfile PHP:FPM

# See https://github.com/docker-library/php/blob/master/7.1/fpm/Dockerfile
FROM php:7.1-fpm
ARG TIMEZONE
MAINTAINER Maxence POUTORD <maxence.poutord@gmail.com>
RUN apt-get update && apt-get install -y 
    openssl 
    git 
    unzip
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone
RUN printf '[PHP]ndate.timezone = "%s"n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini
RUN "date"
# Type docker-php-ext-install to see available extensions
RUN docker-php-ext-install pdo pdo_mysql

# install xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
#RUN echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.idekey="PHPSTORM"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# DockerNAT gateway IP
RUN echo "xdebug.remote.host=10.0.75.1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote.mode=req" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote.handler=dbgp" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

RUN echo 'alias sf="php app/console"' >> ~/.bashrc
RUN echo 'alias sf3="php bin/console"' >> ~/.bashrc
WORKDIR /var/www/free-energy/symfony

docker-compose.yml:

# https://github.com/maxpou/docker-symfony
version: '2'
services:
    db:
        image: mysql
        volumes:
            - "./.data/db:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    php:
        build:
            context: php7-fpm
            args:
                TIMEZONE: ${TIMEZONE}
        volumes:
            - ${SYMFONY_APP_PATH}:/var/www/free-energy/symfony
            - ./logs/symfony:/var/www/free-energy/symfony/app/logs
        environment:
            PHP_IDE_CONFIG: serverName=free-energy.org
    nginx:
        build: nginx
        ports:
            - 80:80
        volumes_from:
            - php
        volumes:
            - ./logs/nginx/:/var/log/nginx
    elk:
        image: willdurand/elk
        ports:
            - 81:80
        volumes:
            - ./elk/logstash:/etc/logstash
            - ./elk/logstash/patterns:/opt/logstash/patterns
        volumes_from:
            - php
            - nginx

xdebug流量并没有发现它返回到我的主机。当我在xdebug.remote_host中输入主机计算机的IP地址时,调试有效,但这并不理想,因为我的IP在每个重新启动时都会更改。幸运的是,Docker提供了一种通过DNS-Entry docker.for.win.localhost获取主机IP的方法。

编辑:
Docker现在有一个独立于平台的DNS-Entry host.docker.internal

我尝试使用xdebug.remote_connect_back = 1,它只是响应来自何处的流量,但它不起作用。phpinfo()显示远程_ADDR设置为localhost。在此上下文中,Localhost指向Docker PHP容器,同时应指向我们的主机IP。重要的是要知道。

来自xdebug文档:

xdebug.remote_connect_back 类型:布尔值,默认值:0,在xdebug> = 2.1

中引入

如果启用了,xdebug.remote_host设置将被忽略,Xdebug将尝试连接到制作HTTP请求的客户端。

这是带有xdebug.ini配置的dockerfile,用于使用:

的PHP Docker容器
FROM php:7.1-fpm
ARG TIMEZONE
MAINTAINER Maxence POUTORD <maxence.poutord@gmail.com>
RUN apt-get update && apt-get install -y 
    openssl 
    git 
    unzip
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone
RUN printf '[PHP]ndate.timezone = "%s"n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini
RUN "date"
# Type docker-php-ext-install to see available extensions
RUN docker-php-ext-install pdo pdo_mysql
# install xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN echo "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# relevant to this answer
RUN echo "xdebug.idekey="PHPSTORM"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_host=docker.for.win.localhost" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo 'alias sf="php app/console"' >> ~/.bashrc
RUN echo 'alias sf3="php bin/console"' >> ~/.bashrc
WORKDIR /var/www/free-energy/symfony


编辑:
在这篇文章中,我在Xdebug乱七八糟。
现在我知道您的Xdebug配置不一定像我那时那样大。

xdebug.ini :(在您的Docker php图像中)。

zend_extension=xdebug.so
[Xdebug]
xdebug.remote_enable=true
xdebug.remote_port=9000
xdebug.remote_host=host.docker.internal

添加remote_connect_back = on,因此xdebug连接到当前访问者(使用远程_ADDR系统变量),而不是可能会更改的远程_host。您也可以尝试远程_AUTOSTART = ON,以确保此问题与浏览器本身无关。

请记住在PHPSTORM中配置映射,但无论如何都会告诉您这样做。另外,请确保IDE正在收听调试会话(调试工具栏中的小切换)。祝你好运。

最新更新