es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la configuración de red, específicamente con la opción network_mode: host en el archivo docker-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 archivo docker-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 puerto 2345) 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.

Comments are closed.