Skip to content
Advertisement

How to debug a JDK docker container in intellij idea?

I want to start up a docker container with debug options as follows, but the startup won’t work:

Dockerfile:

# syntax=docker/dockerfile:1
FROM maven:3-eclipse-temurin-11 as dependencies
WORKDIR /opt/app
COPY .dockerdev/settings.xml .
COPY pom.xml .
COPY src src
ENTRYPOINT["mvn", "spring-boot:run"]

docker-compose.yml:

version: '3.7'
services:
  app:
    environment:
      - "JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
    ports:
      - 8080:8080
      - 5005:5005
      

Result:

docker-compose up
Recreating my_app ... done
Attaching to my_app
app_1  | Picked up JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
app_1  | Listening for transport dt_socket at address: 5005
app_1  | [INFO] Scanning for projects...
app_1  | [INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ my_app ---
app_1  | [INFO] Using 'UTF-8' encoding to copy filtered resources.
app_1  | [INFO] Using 'UTF-8' encoding to copy filtered properties files.
app_1  | [INFO] Copying 3 resources
app_1  | [INFO] Copying 3 resources
app_1  | [INFO] 
app_1  | [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ my_app ---
app_1  | [INFO] Changes detected - recompiling the module!
app_1  | [INFO] 
app_1  | [INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ my_app ---
app_1  | [INFO] Using 'UTF-8' encoding to copy filtered resources.
app_1  | [INFO] Using 'UTF-8' encoding to copy filtered properties files.
app_1  | [INFO] Copying 3 resources
app_1  | [INFO] 
app_1  | [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ my_app ---
app_1  | [INFO] Changes detected - recompiling the module!
app_1  | [INFO] Compiling 5 source files to /opt/app/target/test-classes
app_1  | [INFO] 
app_1  | [INFO] <<< spring-boot-maven-plugin:2.6.7:run (default-cli) < test-compile @ my_app <<<
app_1  | [INFO] 
app_1  | [INFO] 
app_1  | [INFO] --- spring-boot-maven-plugin:2.6.7:run (default-cli) @ my_app ---
app_1  | [INFO] Attaching agents: []
app_1  | Picked up JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
app_1  | ERROR: transport error 202: bind failed: Address already in use
app_1  | ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
app_1  | JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [./src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c:735]
app_1  | [INFO] ------------------------------------------------------------------------
app_1  | [INFO] BUILD FAILURE
app_1  | [INFO] ------------------------------------------------------------------------
app_1  | [INFO] Total time:  3.000 s
app_1  | [INFO] Finished at: 2022-05-23T12:30:50Z
app_1  | [INFO] ------------------------------------------------------------------------
app_1  | [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.6.7:run (default-cli) on project my_app: Application finished with exit code: 2 -> [Help 1]
app_1  | [ERROR] 
app_1  | [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
app_1  | [ERROR] Re-run Maven using the -X switch to enable full debug logging.
app_1  | [ERROR] 
app_1  | [ERROR] For more information about the errors and possible solutions, please read the following articles:
app_1  | [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
my_app exited with code 1

Sidenote: Port 5005 is of course not running/listening on my host! Also, if I change the port to 5006, 5007 etc, the error is always the same.

So why is the port blocked on mvn spring-boot:run?

Advertisement

Answer

The problem with your solution is that there are 2 debug sessions being started. 1 for the maven command and 1 for the forked JVM voor Spring Boot. Hence the error and changing the port won’t solve this as the problem will remain.

What you need to do is remove the JAVA_TOOL_OPTIONS from your docker compose file and instead add the following to your entry point

-Dspring-boot.run.jvmArguments=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

That way it will only apply to the Spring Boot plugin and will be taken into account when launching the app in a new JVM.

3 People found this is helpful
Advertisement