在Mac OS上的Dockerized PHP中使用XDebug

问题

我无法从MacOS上的Docker化容器中使用Xdebug进行debugging。

我已经仔细阅读: XDebug远程configuration , Nikita Nikitinpost和Stackoverflow和Github上的所有build议的解决scheme。 我仍然被阻止

在容器中

我可以连接到容器bash -c "clear && docker exec -it DockerizedSample sh"

它确认XDebug已安装。

 # php -m -c [PHP Modules] Core ... xdebug ... [Zend Modules] Xdebug 

其configuration似乎有效。

 # tail /usr/local/etc/php/conf.d/xdebug.ini xdebug.idekey=PHPSTORM xdebug.remote_host=172.17.0.1 xdebug.remote_enable=1 xdebug.remote_mode=req xdebug.remote_port=9000 xdebug.remote_autostart=0 xdebug.remote_connect_back=0 zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so 

泊坞窗文件

 FROM bartlebys/php-apache-mongo:latest MAINTAINER Benoit Pereira da Silva <https://pereira-da-silva.com> COPY /html /var/www/html/ ################################ ## CONFIGURE AND ENABLE XDEBUG # ################################ #Erase the current Configuration of xdebug RUN echo "" > /usr/local/etc/php/conf.d/xdebug.ini #Configure XDEBUG RUN HOST_IN_CONTAINER_IP=$(/sbin/ip route|awk '/default/ { print $3 }')\ &&echo "xdebug.idekey=PHPSTORM" >> /usr/local/etc/php/conf.d/xdebug.ini \ && echo "xdebug.remote_host=$HOST_IN_CONTAINER_IP" >> /usr/local/etc/php/conf.d/xdebug.ini \ && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ && echo "xdebug.remote_mode=req" >> /usr/local/etc/php/conf.d/xdebug.ini \ && echo "xdebug.remote_port=9000" >> /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 # Enable XDEBUG's extension RUN echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" >> /usr/local/etc/php/conf.d/xdebug.ini 

运行脚本

 #!/bin/sh # Stop the container echo "Stop " docker stop DockerizedSample # Delete the container echo "Remove " docker rm DockerizedSample # Delete the image if necessary docker rmi dockerizedsampleimage:latest # Build the youdubserver image echo "Building with the current source" docker build -t dockerizedsampleimage:latest . # Run DockerizedSample container echo "Run container " # Run the container once. # then grab the IP of the HOST in the container # stop and relaunch with the good IP docker run -d --name DockerizedSample dockerizedsampleimage HOST_IN_CONTAINER_IP=$(docker exec DockerizedSample /sbin/ip route|awk '/default/ { print $3 }') docker stop DockerizedSample docker rm DockerizedSample # Run the debuggable container docker run -e PHP_IDE_CONFIG="serverName=Dockerized"\ -e XDEBUG_CONFIG="remote_host=$HOST_IN_CONTAINER_IP"\ -p 27017:27017 \ -p 8001:80\ -d --name DockerizedSample dockerizedsampleimage\ # Start mongod echo "Start mongod " docker exec DockerizedSample service mongod start echo "IP in Docker Host" echo "$HOST_IN_CONTAINER_IP" echo "Local IP" ipconfig getifaddr en0 # Open localhost in a browser on macOS if [[ "$OSTYPE" =~ ^darwin ]]; then open http://localhost:8001/ fi; 

如何重现这个问题

  1. 下载Php-Apache-Mongo / zip / master
  2. 转到PHPStorm文件夹并运行shell脚本./run.sh

在build立图像(可能需要几分钟)并运行容器后,它应该打开http:// localhost:8001 /

我目前的testing环境

  • PhpStorm 2016.2.1
  • 编号PS-162.1889.1,build于2016年8月23日
  • 您有此版本的永久回退许可证
  • JRE:1.8.0_76-release-b216 x86_64
  • JVM:由JetBrains sro提供的OpenJDK 64位服务器虚拟机
  • macOS Sierra 10.12(16A323)
  • Docker for Mac从官方docker for mac 版本1.12.1安装 (build:12133)2d5b4d9c3daa089e3869e6355a47dd96dbf39856

基本上对于远程debugging,扩展不做任何事情,但将Cookie XDEBUG_SESSION设置为idekey的值。 在你的“复杂”情况下,我最好先检查以下4件事:

  1. 你的xdebug.remote_port = 9000。

如果通过php-fpm在端口#9000被占用在服务器端(您使用IDE的地方),IDE不能开始监听传入的连接。 简单的9000是fpm的默认端口,这通常是一个常见的错误。 这就是为什么我使用端口#10000。

  1. docker运行-e PHP_IDE_CONFIG =“serverName = Dockerized”

这里的PHP_IDE_CONFIG不是一个环境variables 。 这实际上是一个nginxconfiguration的fastcgi_param指令的参数。

  1. 使用xdebug.remote_log = / path / to / xdebug_remote.log

  2. 我个人更喜欢使用旧的软件。 所以我在这里不是一个好帮手,但据我所知,Phpstorm现在使用了不同的configuration来进行远程debugging。

我终于find了解决办法。它并不复杂。 我用'telnet'来确定容器是否能够到达9000上的主机。而事实并非如此。 混淆来自远程主机IP。 你必须使用你的本地IP地址!

 HOST_IP=$(ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}') docker run -e PHP_IDE_CONFIG="serverName=DockerLocal"\ -e XDEBUG_CONFIG="idekey=PHPSTORM"\ -e XDEBUG_CONFIG="remote_host=$HOST_IP"\ -p 27017:27017 \ -p 8001:80\ -d --name DockerizedSample dockerizedsampleimage 

查看hub.docker.com上的 详细信息或直接在Bartleby的Php-Apache-Mongo的github存储库上查看