Debugging Tomcat in Docker container
Solution 1
This is the command I use for this:
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
Explanation
-
-e JPDA_ADDRESS=8000
debugging port in container, passed as environment variable -
-e JPDA_TRANSPORT=dt_socket
transport type for debugging as socket, passed as environment variable -
-p 8888:8080
expose tomcat port 8080 on host as port 8888 -
-p 9000:8000
expose java debugging port 8000 on host as port 9000 -
-v {host-file}:{container-file}
overwrite tomcat-user.xml with my local on, since I need access to the manager api
omit this line if this isn't necessary for your use case -
tomcat:8.0
see https://hub.docker.com/_/tomcat/ -
/usr/local/tomcat/bin/catalina.sh jpda run
command to run in the container
Solution 2
The accepted answer didn't work for me, apparently because I was using Java 11. It seems that if you're using Java 9 or newer, you need to specify the JPDA address like this:
JPDA_ADDRESS=*:8100
Solution 3
You can always update the Dockerfile
to something like the following: -
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"]
This does mean though that your docker file has debug on by default which is probably not suited to a production environment.
Solution 4
Try add to your Dockerfile
ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket
It works for me
Solution 5
I resolved a similar, if not the same, issue when using docker-compose.
It involved the environment variables not being passed properly from the docker-compose.yml file.
CAPS LOCK
Updated on June 24, 2020Comments
-
CAPS LOCK almost 4 years
I have a CoreOS running in Vagrant. Vagrant private network IP is 192.168.111.1. Inside a CoreOS is a docker container with Tomcat 8.0.32. Pretty much everything works ok (app deployment etc.) just debugging does not. Tomcat is mapped to 8080 port and the JPDA port should be 8000.
Facts
Tomcat JPDA is configured with:
JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
It starts with
catalina.sh jpda start
command. The output in the console when running it withdocker-compose
is:tomcat | Listening for transport dt_socket at address: 8000
From the container info I assume that ports are mapped as they should:
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
My docker image is based on this Dockerfile.
Problem
When trying to run Remote debug configuration (screenshot below) I get the error
Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused"
. I've tried everything from changing various configuration but no luck. Am I missing something?