在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;
如何重现这个问题
- 下载Php-Apache-Mongo / zip / master
- 转到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件事:
- 你的xdebug.remote_port = 9000。
如果通过php-fpm在端口#9000被占用在服务器端(您使用IDE的地方),IDE不能开始监听传入的连接。 简单的9000是fpm的默认端口,这通常是一个常见的错误。 这就是为什么我使用端口#10000。
- docker运行-e PHP_IDE_CONFIG =“serverName = Dockerized”
这里的PHP_IDE_CONFIG不是一个环境variables 。 这实际上是一个nginxconfiguration的fastcgi_param指令的参数。
-
使用xdebug.remote_log = / path / to / xdebug_remote.log
-
我个人更喜欢使用旧的软件。 所以我在这里不是一个好帮手,但据我所知,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存储库上查看