remoto remote intellij idea debug configurar debugging tomcat intellij-idea jpda

debugging - remote - Depuración de Tomcat en contenedor Docker



tomcat debug remoto (6)

Tengo un CoreOS corriendo en Vagrant. La red privada de Vagrant IP es 192.168.111.1. Dentro de un CoreOS hay un contenedor docker con Tomcat 8.0.32. Casi todo funciona bien (implementación de aplicaciones, etc.), pero la depuración no funciona. Tomcat se asigna al puerto 8080 y el puerto JPDA debe ser 8000.

Hechos

Tomcat JPDA está configurado con:

JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Comienza con el comando de catalina.sh jpda start . La salida en la consola cuando se ejecuta con docker-compose es:

tomcat | Listening for transport dt_socket at address: 8000

Desde la información del contenedor, asumo que los puertos se asignan como deberían:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dcae1e0148f8 tomcat "/run.sh" 8 minutes ago Up 8 minutes 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp tomcat

Mi imagen docker se basa en este Dockerfile .

Problema

Cuando intento ejecutar la configuración de depuración remota (captura de pantalla a continuación), aparece el error Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused" . He intentado todo desde cambiar varias configuraciones pero sin suerte. ¿Me estoy perdiendo de algo?


Debe asegurarse de que el puerto 8080 esté expuesto a IntelliJ para la conexión. Es decir, mientras ejecuta la ventana acoplable, necesitará algo como docker run -p 8080:8080

Por ejemplo, puedo lograr un requisito similar como este haciendo los pasos / verificaciones mencionados a continuación.

Así es como se ve el comando de mi ventana acoplable:

sudo docker run --privileged=true -d -p 63375:63375 -p 63372:8080 -v /tmp/:/usr/local/tomcat/webapps/config <container name>:<tag>

NOTA: Estoy exponiendo un puerto adicional 63375 en el contenedor y en mi host ambos. El mismo puerto que estoy usando en CATALINA_OPTS a continuación.

Así es como se ve mi punto de entrada (para la imagen que estoy construyendo). NOTA: Estoy usando CATALINA_OPTS. Además, estoy usando maven para crear una imagen, por lo que a continuación se muestra un extracto de pom.xml.

<entryPoint> <shell>cd /usr/local/tomcat/bin; CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=63375,server=y,suspend=n" catalina.sh run</shell> </entryPoint>


Este es el comando que uso para esto:

docker run -it --rm / -e JPDA_ADDRESS=8000 / -e JPDA_TRANSPORT=dt_socket / -p 8888:8080 / -p 9000:8000 / -v D:/tc/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml / tomcat:8.0 / /usr/local/tomcat/bin/catalina.sh jpda run

Explicación

  • -e JPDA_ADDRESS = 8000
    puerto de depuración en el contenedor, pasado como variable de entorno
  • -e JPDA_TRANSPORT = dt_socket
    Tipo de transporte para la depuración como socket, pasado como variable de entorno
  • -p 8888: 8080
    expone tomcat port 8080 en host como port 8888
  • -p 9000: 8000
    expone el puerto de depuración de Java 8000 en el host como el puerto 9000
  • -v {archivo-host}: {archivo-contenedor}
    sobrescriba tomcat-user.xml con mi local activado, ya que necesito acceso a la API del administrador
    omita esta línea si no es necesario para su caso de uso
  • tomcat: 8.0
    vea https://hub.docker.com/_/tomcat/
  • /usr/local/tomcat/bin/catalina.sh jpda run
    comando para ejecutar en el contenedor

Intenta agregar a tu Dockerfile

ENV JPDA_ADDRESS=8000 ENV JPDA_TRANSPORT=dt_socket

Esto funciona para mi


Resolví un problema similar, si no el mismo, al usar docker-compose.

Implica que las variables de entorno no se pasen correctamente desde el archivo docker-compose.yml.

Ver mi problema de desbordamiento de pila:


Siempre puede actualizar el Dockerfile a algo como lo siguiente:

FROM tomcat:8-jre8 MAINTAINER me ADD target/app.war /usr/local/tomcat/webapps/app.war ENV JPDA_ADDRESS="8000" ENV JPDA_TRANSPORT="dt_socket" EXPOSE 8080 8000 ENTRYPOINT ["catalina.sh", "jpda", "run"]

Sin embargo, esto significa que su archivo docker se ha depurado de forma predeterminada, lo que probablemente no sea adecuado para un entorno de producción.


Tengo una configuración similar en mi entorno local. Incluí JPDA_ADDRESS como variable de entorno en el Dockerfile y recreé los contenedores.

ENV JPDA_ADDRESS 8000 #Expose port 8080, JMX port 13333 & Debug port 8000 EXPOSE 8080 13333 8000 CMD ["tail", "-f", "/dev/null"]