La depuración remota de Go Delve no funciona con Docker “network_mode: host”.
Hola, estoy intentando ejecutar la depuración remota utilizando dlv dentro de un contenedor de Docker con VSCode. El problema comienza cuando especifico la bandera de docker-compose network_mode: host en lugar del puerto específico (esto es necesario debido al uso de MQTT). Esto hace que VSCode arroje el siguiente error: “No se pudo continuar: Error: connect ENCONNREFUSED …”
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote Docker",
"type": "go",
"request": "attach",
"mode": "remote",
"remotePath":"/go/src/work/cmd/mapper",
"port": 2345,
// "host": "127.0.0.1",
"cwd": "${workspaceFolder}/src/cmd/mapper",
"args": [],
"trace" : "verbose",
"env" : {}
},
]
}
docker-compose.yml
version: "3.4"
services:
golang:
container_name: golang
image: gotestdlv:latest
privileged: true
volumes:
- ./src/:/go/src/work/
network_mode: host
# ports:
# - 2345:2345 # puerto de depuración
davy.ai
El problema parece estar relacionado con la configuración de red, específicamente con la opción
network_mode: host
en el archivodocker-compose.yml
. Cuando se utiliza esta opción, el contenedor de Docker comparte la pila de red del host, lo que significa que las interfaces de red del contenedor están directamente conectadas a las interfaces de red del host. Esto puede ser útil en algunos casos, pero también puede causar problemas con conflictos de puertos y conectividad.En este caso, parece que el error
ENCONNREFUSED
ocurre porque el contenedor intenta conectarse a un puerto específico en el host, pero ese puerto puede no estar disponible o ser accesible desde dentro del contenedor. Una forma de resolver este problema es utilizar una configuración de red diferente que permita un control más detallado sobre las interfaces de red y la conectividad del contenedor.Una posible solución es utilizar la opción
ports
en el archivodocker-compose.yml
, que mapea un puerto específico en el host a un puerto dentro del contenedor. De esta manera, puedes exponer el puerto del depurador (en este caso, el puerto2345
) al host y luego utilizar ese número de puerto en la configuración de depuración remota en VSCode.Otra opción es utilizar una red personalizada de Docker, que permite un mayor control sobre la configuración de red y también puede proporcionar un mejor aislamiento entre contenedores. Por ejemplo, puedes crear una nueva red utilizando el comando
docker network create
y luego utilizar la opción--network
al ejecutar el contenedor para adjuntarlo a esa red. De esta manera, puedes especificar direcciones IP o nombres de host específicos para el contenedor y asegurarte de que pueda comunicarse con otros contenedores o servicios en la red.En general, la mejor solución dependerá de los requisitos y limitaciones específicas de tu aplicación y entorno. Es importante considerar cuidadosamente la configuración de red y las necesidades de conectividad, y probar diferentes opciones para encontrar la solución más adecuada.