Reputation: 1993
For some reason I have issues connecting remote debug to a spring-boot app running inside docker. I start the java app with:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar app.jar
For docker I expose these ports on docker-compose:
ports:
- "8080:8080"
- "8000:8000"
However, the debugger is not able to connect on port 8000. It works when I run the server locally but not inside docker. Any idea why?
Docker ps output:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d17e6851807 pocmanager_manager:latest "/bin/sh -c 'java -D 3 seconds ago Up 2 seconds 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp pocmanager_manager_1
35ed2e2c32bc redis:latest "/entrypoint.sh redi 14 seconds ago Up 13 seconds 0.0.0.0:6379->6379/tcp pocmanager_redis_1
Upvotes: 20
Views: 27033
Reputation: 11608
I had an issue connecting to a Spring Boot application running with Docker Compose and solved it with the settings below:
Project structure
- project
- some-api
- src
- Dockerfile
- build.gradle
- docker-compose.yml
project/docker-compose.yml
version: "3.9"
services:
api:
image: rbento/some-api
build:
context: ./some-api
dockerfile: Dockerfile
container_name: api
ports:
- 8080:8080
- 5005:5005
project/some-api/Dockerfile
FROM adoptopenjdk/openjdk11:ubi
COPY build/libs/some-api-1.0.0.jar api.jar
ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n","-Djava.security.egd=file:/dev/./urandom","-jar","/api.jar"]
IntelliJ IDEA
Create a Remote JVM Debug
configuration, like so:
some-api-debug
Attach to remote JVM
localhost
5005
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
some-api.main
Debugging
docker-compose up
Output
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Environment
Upvotes: 3
Reputation: 1040
For me it was not enough to just specify the debug port within the address command line parameter. I also needed to wildcard all ip addresses by prefixing the port with *:
:
java -agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n -jar spring-app.jar
Upvotes: 2
Reputation: 3698
i have to realize that in the dockerFile the Expose command only do the half of work, this mean that only expose the port inside the docker, but not outside, in your example the result will be like this:
Debug works with the JAVA_OPTS and remote debug, the dockerFile looks like this:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD gs-spring-boot-docker-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /app.jar" ]
and executing this command:
docker run -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y" -p 8080:8080 -p 8000:8000 -t springio/gs-spring-boot-docker
As you can see, you should expose the debug port, during the run, in my case(eclipse) 8000
Upvotes: 12
Reputation: 2296
Hi I faced the same problem.
I added the following to the entrypoint in the Dockerfile:
"-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
Now it looks like this:
FROM java:8
VOLUME /tmp
ADD realName*.jar app.jar
EXPOSE 4786
RUN sh -c 'touch /app.jar'
ENTRYPOINT
["java","-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
I did not Expose
port 8000 in the Dockerfile.
Hope this helps.
Upvotes: 10
Reputation: 121
I think the reason for this might be, your Virtual Box VM configuration does not tunnel the debug port to the host machine.
Check this link https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md
Basically, in your case, you have to command prompt and run
VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,8000,,8000";
Note : Make sure VBoxManage is in your PATH
Upvotes: 0