Xdebug 3.0 WSL2 和 VSCode - 地址已被 docker-proxy 使用

Xdebug 3.0 WSL2 and VSCode - address is already in use by docker-proxy

我在 WSL:Ubuntu 中的 VSCode 无法监听 xdebug 端口,因为它被一些 docker-proxy 阻止了。 我正在关注此 Solution,但尝试 VSCode 监听 xdebug 端口,导致以下错误: Error: listen EADDRINUSE: address already in use :::9003

谁能帮忙连接 VSCode 到 xdebug?

Windows 11表示端口已经被wslhost分配:

PS C:\WINDOWS\system32> Get-Process -Id (Get-NetTCPConnection -LocalPort 9003).OwningProcess

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    285      47     2288       4748       0,05  19480   1 wslhost

Ubuntu 告诉它,它是由一些 docker-proxy:

分配的
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:9003            0.0.0.0:*               LISTEN      17210/docker-proxy
tcp6       0      0 :::9003                 :::*                    LISTEN      17217/docker-proxy

docker-撰写版本:docker-compose version 1.25.0

xdebug.log 说:

[Step Debug] INFO: Connecting to configured address/port: host.docker.internal:9003.
[Step Debug] ERR: Time-out connecting to debugging client, waited: 200 ms. Tried: host.docker.internal:9003 (through xdebug.client_host/xdebug.client_port) :-(

只要没有人在听就可以了。

至于xdebug.client_host我试过:

从 Dockerfile/docker-compose 中删除 Expose 指令,如此 comment 也不会删除错误。

解决了。对于有此挑战的其他人:

wsl-ubuntu 内部 -> docker-containter host.docker.internal 指向错误的 ip。 在 wsl-distribution 中,文件 /etc/resolv.conf 是 windows 主机的 ip。 要获得正确的 ip,请使用此答案:How to get the primary IP address of the local machine on Linux and OS X?

我的解决方案是用这个 ip 定义一个 env-variable:

alias docker_compose_local_ip="ifconfig eth0 | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*//p'"
export DOCKER_COMPOSE_LOCAL_IP=$(docker_compose_local_ip)

并用它配置容器:

services:
  service-name:
    environment:
      - XDEBUG_CONFIG=client_host=${DOCKER_COMPOSE_LOCAL_IP} ...