Hay muchas publicaciones en SO y en otros lugares sobre cómo configurar esto. Hasta ahora no he tenido éxito en hacer que funcione.
Configuración
Máquina local: Windows 10, con Cygwin, git bash y WSL2 con Ubuntu instalado; y MacBook Air (Mojave)
Máquina host: instancia de AWS EC2 que ejecuta Amazon Linux 2
Contenedor Docker: CentOS 7.8 ejecutando PHP con Xdebug
Meta
Depure de forma remota el código PHP en el contenedor desde la máquina local utilizando un túnel inverso desde la máquina local hasta el contenedor.
He hecho que esto funcione antes cuando el código PHP se instaló localmente en la máquina host, por lo que la pregunta no es sobre Xdebug. Tan pronto como moví el código PHP al contenedor, la depuración ya no funciona.
lo que he probado
La configuración de un túnel inverso desde la máquina local hasta la instancia EC2 del host funciona. Para esto, estoy haciendo ssh -vvv -i "aws.pem" -R 9000:localhost:9000 user@ec2instance en terminal, cygwin o git bash y probando con nc -z localhost 9000 || echo 'no tunnel open' en la máquina host.
Cuando docker exec -it container bash en el contenedor y ejecuto nc, el túnel no está disponible.
Estoy usando docker-compose:
version: '2' services: web: image: 'privateregistry/project/container:latest' restart: always container_name: web ports: - '8082:80' - '447:443' - '9000:9000' volumes: - '.:/var/www/project'He probado con y sin mapear el puerto 9000. He probado variaciones del túnel ssh:
ssh -vvv -i "aws.pem" -R :9000:localhost:9000 user@ec2instance
ssh -vvv -i "aws.pem" -R 0.0.0.0:9000:localhost:9000 user@ec2instance
ssh -vvv -i "aws.pem" -R \*:9000:localhost:9000 user@ec2instance
ssh -vvv -i "aws.pem" -R 9000:172.20.0.2:9000 user@ec2instance (IP del contenedor)
También intenté usar ssh -L sin suerte.
Varias publicaciones, como esta, sugieren agregar GatewayPorts GatewayPorts yes en la máquina host. He intentado esto también sin cambios.
No he intentado usar --network=host , principalmente por motivos de seguridad. También preferiría no usar ngrok, ya que me gustaría poder usar localhost o host.docker.internal para la configuración de xdebug.remote_host .
Para completar, esto es lo que tengo para Xdebug:
[XDebug] xdebug.remote_enable=1 xdebug.remote_autostart=1 xdebug.remote_handler="dbgp" xdebug.remote_port=9000 xdebug.remote_host="host.docker.internal" ;xdebug.remote_connect_back=1 xdebug.idekey = VSCODE xdebug.remote_log = "/var/log/xdebug.log"Tengo esto funcionando. Después de leer en la página de manual de ssh y revisar las cosas nuevamente, me di cuenta de que estaba vinculando a la IP del contenedor docker, no a la IP del puente (docker0).
Actualicé mi comando de conexión a ssh -vvv -i "aws.pem" -R 9000:172.17.0.1:9000 user@ec2instance con la IP correcta y el túnel comenzó a funcionar. Todavía tengo GatewayPorts habilitado (según la página del manual) y eliminé el mapeo 9000:9000.
Luego actualicé mi valor xdebug.remote_host a la misma IP y ahora funciona la depuración. No estoy seguro de por qué host.docker.internal no funcionó, pero eso es para otro día.