使用远程调试运行 docker-compose。智能,Java 11

Posted

技术标签:

【中文标题】使用远程调试运行 docker-compose。智能,Java 11【英文标题】:Run docker-compose with remote debug. Intelij, Java 11 【发布时间】:2020-12-29 16:16:51 【问题描述】:

我将指南中的步骤应用于我的项目 (https://www.jetbrains.com/help/idea/run-and-debug-a-spring-boot-application-using-docker-compose.html)。 总而言之,我将此行添加到 Dockerfile -Djava.security.egd=file:/dev/./urandom 并将命令添加到 docker-compose command: java -Djava.security.egd=file:/dev/./urandom -jar /usr/app/test-app.jar。 在docker-compose点击命令附近的debug按钮后,远程配置为:

Debugger mode: Attach to remote JVM
Transport: Socket
Host: localhost
Port: 5005
Command line arguments for remote JVM: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005;

Docker Compose 运行配置(启动前)选项:

--------------------------------------------------
Port               | Local port | Container port |
-------------------------------------------------|
Java Debugger port | 5005       | 5005           |
--------------------------------------------------

Custom command: java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -Djava.security.egd=file:/dev/./urandom -jar /usr/app/test-app.jar
Custom options: -p 5005:5005

运行我收到异常的配置: Error running 'Remote JVM Debug with compose': Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused: connect"

我尝试通过将地址更改为*:<port> 来解决此问题。 生成的自定义命令是 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -Djava.security.egd=file:/dev/./urandom -jar /usr/app/test-app.jar。 然后我得到异常: Error running 'Remote JVM Debug with compose': Unable to open debugger port (localhost:5005): java.io.IOException "handshake failed - connection prematurally closed"。 我也尝试将端口更改为8080,但结果是一样的。如何解决此问题并使用 docker-compose 进行远程配置(启动前)? 项目演示问题:https://github.com/leonaugust/intelij_docker_problem

Dockerfile

# Build stage
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package -DskipTests

# Run stage
FROM adoptopenjdk/openjdk11:alpine-jre
COPY --from=build /usr/src/app/target/test-app.jar /usr/app/test-app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar", "-Djava.security.egd=file:/dev/./urandom","/usr/app/test-app.jar"]

docker-compose.yml

version: '3.1'
services:

  test-app:
    build: .
    container_name: test-app
    image: test-app

    ports:
      - 8080:8080
    command: java -Djava.security.egd=file:/dev/./urandom -jar /usr/app/test-app.jar

【问题讨论】:

对我也不起作用。似乎 IntelliJ 中的一个错误,因为设置自定义命令根本不会替换容器中的入口点。您可以在您的docker-compose 文件中添加entrypoint: java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -Djava.security.egd=file:/dev/./urandom -jar /usr/app/test-app.jar 并尝试。 ENTRYPOINT ["java","-jar", "-Djava.security.egd=file:/dev/./urandom","/usr/app/test-app.jar"] 你确定这是正确的参数顺序吗?在 Dockerfile 中尝试 ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/usr/app/test-app.jar"] 【参考方案1】:

Dockerfile 试试:

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/usr/app/test-app.jar"]

【讨论】:

产生相同的结果。 handshake failed - connection prematurally closed 虽然,重要的是要注意 @michalk 建议将入口点添加到 docker-compose 文件有效。 entrypoint: java agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -Djava.security.egd=file:/dev/./urandom -jar /usr/app/test-app.jar【参考方案2】:

Dockerfile中的关键字ENTRYPOINT改为CMD

【讨论】:

以上是关于使用远程调试运行 docker-compose。智能,Java 11的主要内容,如果未能解决你的问题,请参考以下文章

使用intellij远程调试nodejs

智汀家庭云-快速入门:使用Docker运行

如何使用 PhpStorm / WebStorm 连接到远程 nodejs 调试会话?

如何使用 pycharm 调试在 docker-compose 中运行的进程

使用 ssh 从 Gitlab CI 在远程主机上运行 docker-compose

带有 docker-compose 的 VScode 调试器