Mac M1 2021 上 Docker 内的 Xdebug 无法正常工作

Xdebug inside Docker on Mac M1 2021 is not working

我将本地开发设置从 Linux 移植到新的 Mac 机器上,但在 Mac M1 Pro 机器上让 Xdebug 与 PhpStorm 一起工作时遇到问题。

我有一个 PHP 的容器,其中 Xdebug 安装和配置如下:

zend_extension=/usr/lib/php8/modules/xdebug.so
xdebug.mode=debug

xdebug.idekey=PHPSTORM
xdebug.client_port=9001
xdebug.start_with_request=yes
xdebug.discover_client_host=1
xdebug.log=/var/log/xdebug.log

在 PhpStorm 中,我正在监听端口 9001(我将 9000 用于其他服务)。

这是 docker 容器内的 Xdebug 日志,位于 /var/log/xdebug.log

/var/www/html/app # tail -f /var/log/xdebug.log 
[49] [Step Debug] INFO: Checking header 'HTTP_X_FORWARDED_FOR'.
[49] [Step Debug] INFO: Checking header 'REMOTE_ADDR'.
[49] [Step Debug] INFO: Client host discovered through HTTP header, connecting to 172.18.0.4:9001.
[49] [Step Debug] WARN: Creating socket for '172.18.0.4:9001', poll success, but error: Operation in progress (29).
[49] [Step Debug] WARN: Could not connect to client host discovered through HTTP headers, connecting to configured address/port: localhost:9001. :-|
[49] [Step Debug] WARN: Creating socket for 'localhost:9001', poll success, but error: Operation in progress (29).
[49] [Step Debug] WARN: Creating socket for 'localhost:9001', connect: Address not available.
[49] [Step Debug] ERR: Could not connect to debugging client. Tried: 172.18.0.4:9001 (from REMOTE_ADDR HTTP header), localhost:9001 (fallback through xdebug.client_host/xdebug.client_port) :-(
[49] Log closed at 2022-03-15 16:28:46.957669

我不明白为什么连接不上happening/failing。

我还有一个 docker-compose.yml 文件,上面的服务 API 为

  api:
    build:
      context: .
    expose:
      - 8080
    container_name: api

我已经试过了?

  1. 更改 xdebug.ini 配置以使用远程主机 docker.for.mac.localhost,然后 host.docker.internal 但没有成功。
  2. 更改为 start_with_request=trigger 而不是 yes
  3. 禁用 Mac 防火墙认为 Docker 可能无法使用端口 9001。

xdebug.discover_client_host=1 与 Docker 一起使用肯定是不正确的,您需要将其设置为 0。discover_client_host 使用 HTTP headers 来查看请求来自,但由于 NAT 涉及 Docker Xdebug(和 PHP)将看到它无法连接到的 IP 地址或主机名。

设置 xdebug.client_host=host.docker.internal 应该与 Docker 正确,这应该是网络网关地址,这也是您的主机。

(即使 xdebug.discover_client_host=1,因为如果 Xdebug 无法连接到它通过 HTTP header发现。)

如果您想查看更详细的日志,还可以添加 xdebug.log_level=10,这应该会提供更多信息。

对于 Xdebug,您不需要 docker-compose.yaml 中的“绑定端口”,因为 Xdebug 确实建立了 IDE 的连接,因此接收连接不需要公开端口。