首页 > 解决方案 > 附加到 IntelliJ 中的 docker 图像

问题描述

我正在尝试设置 IntelliJ 来调试在 docker 容器中运行的 Springboot 应用程序。我配置了一个 docker 镜像(通过指定一个镜像 id)并创建了一个远程应用程序配置,它具有“启动 docker 容器”预操作或任何这些调用。当我开始调试该远程配置时,它会成功启动 docker 容器,但无法连接到端口 5005 以开始调试。
我很困惑,这甚至应该如何工作?我是否需要在 docker 容器配置中指定某些内容以公开端口 5005?
更具体地说,我得到:

error running 'Unnamed Remote Debug': Unable to open debugger port (localhost:5005): java.io.IOException "handshake failed - connection prematurally closed"

标签: dockerdebuggingintellij-idea

解决方案


  1. 要使您的应用程序“可调试”,您需要在-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005启用选项的情况下启动它,以便 java 进程在容器进程中公开一个调试器(我假设容器中的主进程是java进程)
  2. 当 IntelliJ 在主机系统上运行并且您的应用程序在容器中时,您需要将端口发布到主机系统,以便 IntelliJ 可以访问调试器。

在您的情况下,我设法创建了使用自定义入口点启动图像并在容器内公开调试器的配置:

  1. 为您的图像创建 Docker 配置: 在此处输入图像描述 命令需要:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -Djava.security.egd=file:/dev/./urandom -jar app.jar

因此将在端口上5005与主 java 进程一起创建一个调试器。还要记住在此命令末尾更改您的 jar 名称。

  1. 创建一个取决于您的 Docker 映像配置的远程配置: 在此处输入图像描述 需要添加“启动前步骤”,以便在开始调试之前启动您的容器: 在此处输入图像描述 然后只需启动您的远程配置,它应该可以工作。启动它将启动一个容器,其中包含您的应用程序,其中启用了调试器并暴露了调试器端口。端口8080是您的应用程序运行的端口:
$ docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                            NAMES
c7f5f2e3a7b7        21225d2e368e        "java -agentlib:jdwp…"   About a minute ago   Up About a minute   0.0.0.0:5005->5005/tcp, 0.0.0.0:8080->8080/tcp   myapp

推荐阅读