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.
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"]