代码之家  ›  专栏  ›  技术社区  ›  Dimitrios Desyllas

无法将PhpStorm与xdebug与Docker连接

  •  0
  • Dimitrios Desyllas  · 技术社区  · 7 年前

    我有以下Dockerfile文件:

     FROM php:7.0-fpm-alpine
    
    RUN  apk add --update --virtual build_deps gcc g++ autoconf make &&\
      docker-php-source extract &&\
      pecl install xdebug &&\
      echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /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_handler = dbgp" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      echo "xdebug.remote_mode = req" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      docker-php-ext-enable xdebug &&\
      docker-php-source delete && \
      apk del build_deps && \
      rm -rf /var/cache/apk/* && \
      rm -rf /tmp/*
    
    ENTRYPOINT ["php-fpm"]
    

    docker-compose.yml :

    version: '2'
    services:
      nginx_dev:
        image: nginx:alpine
        ports:
          - "5092:5092"
        links:
          - "my_symfony_www_dev"
        volumes:
          - './conf/nginx/nginx_dev.conf:/etc/nginx/nginx.conf:ro'
          - './logs/dev:/var/logs'
        volumes_from:
          - 'my_symfony_www_dev'
    
        my_symfony_www_dev:
          build:
            context: .
            dockerfile: Dockerfile_dev
          image: "myimage/my_symfony_app:dev_php"  
          volumes:
            - "$SOURCE_PATH:/var/www/html:Z"
          environment:
            - PHP_IDE_CONFIG= "serverName=my_symfony_www_dev"
            - XDEBUG_CONFIG="remote_host=10.254.254.254,remote_port=9080"
            - PHP_XDEBUG_ENABLED=1
    

    正如所见 there 我运行:

    sudo ip addr add 10.254.254.254/24 brd + dev enp4s0 label enp4s0:1
    

    并将PhpStorm IDE配置为:

    Remote Debugger PhpStorm settings

    Server

    Xdebug Config

    DBGp Proxy config

    然后在Firefox中按 enter image description here 按钮,然后在PhpStorm中按 enter image description here 按钮I在 app_dev.php 什么都没发生。

    我的系统通过端口侦听 9080 通过 netstat -ntlp PhpStorm侦听的命令(PhpStorm是一个服务器,根据 that answer ).

    tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      4773/java       
    

    你知道为什么会发生这种情况,以及如何解决它吗?

    编辑1:

    这个 phpinfo()

    xdebug phpinfo

    我还设置了de cocker compose。yml as:

    version: '2'
    services:
      nginx_dev:
        image: nginx:alpine
        ports:
          - "5092:5092"
        links:
          - "my_symfony_www_dev"
        volumes:
          - './conf/nginx/nginx_dev.conf:/etc/nginx/nginx.conf:ro'
          - './logs/dev:/var/logs'
        volumes_from:
          - 'my_symfony_www_dev'
    
        my_symfony_www_dev:
          build:
            context: .
            dockerfile: Dockerfile_dev
          image: "myimage/my_symfony_app:dev_php"  
          volumes:
            - "$SOURCE_PATH:/var/www/html:Z"
          environment:
            - XDEBUG_CONFIG="remote_host=10.254.254.254,remote_port=9080"
            - PHP_XDEBUG_ENABLED=1
    

    我的dockerfile是:

    FROM php:7.0-fpm-alpine
    
    RUN  apk add --update --virtual build_deps gcc g++ autoconf make &&\
      docker-php-source extract &&\
      pecl install xdebug &&\
      echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /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=0" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      echo "xdebug.remote_handler = dbgp" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      echo "xdebug.remote_mode = req" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      docker-php-ext-enable xdebug &&\
      docker-php-source delete && \
      apk del build_deps && \
      rm -rf /var/cache/apk/* && \
      rm -rf /tmp/*
    
    ENTRYPOINT ["php-fpm"]
    

    结果仍然相同。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dimitrios Desyllas    7 年前

    最后,我不得不做以下事情 Dockerfile :

    FROM php:7.0-fpm-alpine
    
    VOLUME /var/log/xdebug
    
    ARG XDEBUG_HOST="172.17.0.1"
    ARG XDEBUG_PORT=9021
    
    RUN  apk add --update --virtual build_deps gcc g++ autoconf make &&\
      docker-php-source extract &&\
      pecl install xdebug &&\
      docker-php-ext-enable xdebug &&\
      && 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_handler = dbgp" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      echo "xdebug.remote_mode = req" >> /usr/local/etc/php/conf.d/xdebug.ini &&\
      echo "xdebug.remote_host=${XDEBUG_HOST}" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini &&\
      echo "xdebug.remote_port=${XDEBUG_PORT}" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini &&\
      docker-php-source delete && \
      apk del build_deps && \
      rm -rf /var/cache/apk/* && \
      rm -rf /tmp/*
    
    ENTRYPOINT ["php-fpm"]
    

    这个 XDEBUG_HOST 生成参数包含的ip docker0 GNU/Linux系统上的网络接口(使用 ifconfig 找到答案)。

    在我的 docker-compose.yml

    version: '2'
    services:
      nginx_dev:
        image: nginx:alpine
        ports:
          - "5092:5092"
        links:
          - "my_symfony_www_dev"
        volumes:
          - './conf/nginx/nginx_dev.conf:/etc/nginx/nginx.conf:ro'
          - './logs/dev:/var/logs'
        volumes_from:
          - 'my_symfony_www_dev'
    
        my_symfony_www_dev:
          build:
            context: .
            dockerfile: Dockerfile_dev
            args:
              XDEBUG_HOST: 172.17.0.1
              XDEBUG_PORT: 9021
          image: "myimage/my_symfony_app:dev_php"  
          volumes:
            - "$SOURCE_PATH:/var/www/html:Z"
    

    超过 ./conf/nginx/nginx_dev.conf 映射到我设置了以下设置的卷上 server 章节:

    server_name 0.0.0.0;
    

    然后在phpstorm上使用以下设置:

    Setting Servers over phpstorm

    XDEBUG settings over phpstorm

    那你就可以走了!