【问题标题】:using XDebug in a Dockerized PHP on mac OS在 Mac OS 上的 Dockerized PHP 中使用 XDebug
【发布时间】:2016-10-02 10:48:20
【问题描述】:

问题

我无法在 macOS 上使用 Dockerized 容器中的 Xdebug 进行调试。

我已经非常仔细地阅读了:XDebug Remote configuration Nikita Nikitin post 以及 Stackoverflow 和 Github 上提出的所有解决方案。我还是被屏蔽了..

在容器中

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

它确认 XDebug 已安装。

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

[Zend Modules]
Xdebug

而且它的配置似乎是有效的。

# 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

构建映像(可能需要几分钟)并运行容器后,它应该会在 http://localhost:8001/ 上打开浏览器

我目前的测试环境

  • PhpStorm 2016.2.1
  • 构建 #PS-162.1889.1,构建于 2016 年 8 月 23 日
  • 您拥有此版本的永久后备许可证
  • JRE:1.8.0_76-release-b216 x86_64
  • JVM:JetBrains s.r.o 的 OpenJDK 64 位服务器虚拟机
  • macOS Sierra 10.12 (16A323)
  • Docker for mac 安装自官方docker for mac 版本 1.12.1 (build: 12133) 2d5b4d9c3daa089e3869e6355a47dd96dbf39856

【问题讨论】:

    标签: php shell docker xdebug


    【解决方案1】:

    自 Docker 18.03 发布以来,您的解决方案可以大大简化。

    host.docker.internal DNS 名称已可用于运行 docker 容器。这些 DNS 条目包含 docker 主机的 IP 地址。

    所以,而不是 xdebug.remote_host=172.17.0.1 你可以做 xdebug.remote_host=host.docker.internal

    您还可以删除运行 docker 容器的 run 脚本部分,只是为了获取主机的 IP 地址。

    【讨论】:

    【解决方案2】:

    基本上,对于远程调试,扩展什么都不做,只是将 cookie XDEBUG_SESSION 设置为 idekey 的值。在您的“复杂”案例中,我最好先检查以下 4 件事,这是我首先想到的:

    1. 您的 xdebug.remote_port=9000。

    如果 php-fpm 在服务器端(使用 IDE 的一侧)占用了端口 #9000,则 IDE 无法开始监听传入连接。简单地说 9000 是 fpm 的默认端口,这经常成为一个常见的错误。这就是我使用 #10000 端口的原因。

    1. docker run -e PHP_IDE_CONFIG="serverName=Dockerized"

    这里的 PHP_IDE_CONFIG 不是environment variable。这实际上是一个 nginx 配置的fastcgi_param 指令的参数。

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

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

    【讨论】:

    • 非常感谢尼基塔。我找到了解决方案,它并不那么复杂。我会回答我自己的问题。
    【解决方案3】:

    我终于找到了解决方案。它并没有那么复杂。我已经使用“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
    

    检查details on hub.docker.com 或者直接上the github repository of Bartleby's Php-Apache-Mongo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2019-05-27
      • 2014-09-21
      • 2013-11-03
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多