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
我已经试过了?
- 更改 xdebug.ini 配置以使用远程主机
docker.for.mac.localhost
,然后 host.docker.internal
但没有成功。
- 更改为
start_with_request=trigger
而不是 yes
。
- 禁用 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 的连接,因此接收连接不需要公开端口。
我将本地开发设置从 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
我已经试过了?
- 更改 xdebug.ini 配置以使用远程主机
docker.for.mac.localhost
,然后host.docker.internal
但没有成功。 - 更改为
start_with_request=trigger
而不是yes
。 - 禁用 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 的连接,因此接收连接不需要公开端口。