在 IntelliJ IDEA 的 docker 容器中远程调试 Java 9

Posted

技术标签:

【中文标题】在 IntelliJ IDEA 的 docker 容器中远程调试 Java 9【英文标题】:Remote debugging Java 9 in a docker container from IntelliJ IDEA 【发布时间】:2018-03-21 14:07:25 【问题描述】:

我有一个包含以下内容的 Dockerfile:

FROM openjdk:9

WORKDIR /project

ADD . /project

EXPOSE 5005

我的 docker-compose.yml 看起来像这样:

version: "3.2"
services:
  some-project:
    build: .
    ports:
      - target: 5005
        published: 5005
        protocol: tcp
        mode: host
  command: "java '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005' SomeClass"

当我执行 docker-composer up 时,我看到一条消息“Listening for transport dt_socket at address: 5005”。但是当我尝试连接 jdb 或 Idea 时,我得到“java.io.IOException: handshake failed - connection prematurally closed”。

如果我将 openjdk:9 更改为 openjdk:8,一切正常。但是,我的项目需要 Java 9。

【问题讨论】:

另见:youtrack.jetbrains.com/issue/IDEA-173607 查看这里了解详细步骤***.com/a/61660010/1734444 【参考方案1】:

从 Java 9 开始,JDWP 套接字连接器默认只接受本地连接。看: http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

因此,要从外部启用调试连接,请将*:<port> 指定为地址:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

【讨论】:

谢谢,这对我有用,不知道为什么这不是公认的答案。 对我不起作用。不知道我在这里做错了什么。我已经在我的进程上指定了一个调试端口(在 docker 容器内运行),并且我在我的 docker-compose 上公开了该端口。我错过了什么? 修复 CMD 后,您可能需要运行 docker-compose up --build 来重建映像 如果我使用的是docker-compose.yml文件,而我要调试的服务使用的是端口映射8084:8080,是否需要在调试配置窗口中将端口5005改为8084?当然,在开始调试会话之前,我需要构建映像并运行 docker-compose up,对吧?

以上是关于在 IntelliJ IDEA 的 docker 容器中远程调试 Java 9的主要内容,如果未能解决你的问题,请参考以下文章

如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目

当Docker遇到Intellij IDEA,再次解放了生产力

Docker + IntelliJ IDEA,助你提升 10 倍生产力。。。

Mac下intellij IDEA新建javaweb项目

IntelliJ Idea 制作windows程序界面

使用 Intellij IDEA 重新加载远程 Spring Boot 应用程序时出现异常