如何使用 IntelliJ 调试在 Docker 中运行的应用程序?

Posted

技术标签:

【中文标题】如何使用 IntelliJ 调试在 Docker 中运行的应用程序?【英文标题】:How to debug an application running in Docker with IntelliJ? 【发布时间】:2016-03-13 11:48:18 【问题描述】:

我有一个在 docker 中运行的 Jetty 应用程序。我想使用本地 IntelliJ 调试此应用程序。我在 v 14.1,所以我已经安装了 Docker 集成插件。

在 Clouds 下,我使用的是单击“+”时显示的默认值。 IntelliJ 文档说这应该没问题。这里的

API URL: http://127.0.0.1:2376
Certificates folder: <empty>

我不确定这些是用来做什么的,所以我不知道这些值是否正确。

在运行/调试配置下,我使用的是 Docker 部署,以及以下值:

Deployment: Docker Image
Image ID: The docker image ID 
Container name: The name of the container

当我尝试运行它时,我得到 javax.ws.rs.ProcessingException:org.apache.http.conn.HttpHostConnectException:连接到http://127.0.0.1:2376 [/127.0.0.1] 失败:连接被拒绝

显然我使用的 API URL 值不正确。关于该值应该是什么的任何建议?

我的调试选项是:

 -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n -Djava.compiler=NONE

【问题讨论】:

【参考方案1】:

Shees 没关系。我真的不需要 Docker 集成插件。看起来这更像是直接通过 Intellij 部署和管理 Docker,而不是调试。

为了调试在我的 docker 容器中运行的码头应用程序,我只是进行了远程调试:

运行 |编辑配置 | + |远程

命令行参数已经可以了,因为我使用了默认的远程调试选项。我只需要更改主机设置。这里我使用了我在 docker 容器中设置的主机名

【讨论】:

非常感谢您。通过 Docker 集成使用调试不起作用。现在我只需运行我的 Docker 集成配置来启动服务器,然后运行我的远程调试器进行调试。效果很好。 @JoppeGeluykens 当然。您基本上只是像在任何远程服务器上一样连接到代码。这个远程服务器恰好位于 docker 容器中。 @SomaiahKumbera 在配置远程调试器时,我似乎无法设置断点。有什么想法或其他必要的配置吗? @JoppeGeluykens 这很奇怪。如果您从 IDE 收到可以连接到远程服务器的消息,您应该能够设置断点。如果不能,我怀疑您运行的代码与 IDE 中的 docker 映像中的代码不同。尝试在多个位置单击断点。如果你得到不匹配的断点,你的代码就会不同。 点击 + 时没有看到“远程”选项。有什么解决办法吗?【参考方案2】:

如果有人想在 Windows 机器上进行开发,并同时在远程 docker 上运行/调试应用程序,您可以在此处查看我的 intellij 插件:https://bojanv55.wordpress.com/2018/08/03/intellij-idea-remote-debug-of-java-code-inside-docker-container/

【讨论】:

【参考方案3】:

在 Java 8 中,JDK 支持 JAVA_TOOL_OPTIONS 环境变量,因此要为任何 Java 应用程序启用调试器,您可以将以下参数添加到 docker run 命令:

-p 8000:8000 -e "JAVA_TOOL_OPTIONS=\"-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n\""

然后启动连接到 localhost:8000 的远程调试会话。

【讨论】:

这非常适合使用 docker-compose 将其配置为环境变量:D 不需要外双引号:JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n".【参考方案4】:

如下运行docker镜像:

docker run -d -p 8080:8080  -p 5005:5005 \
    -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" \
    imagename:tagname

对于 java 11 及更高版本,将 JAVA_TOOL_OPTIONS 替换为“-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n”

Intellij 配置步骤:

    从菜单栏中点击runEdit Configurations → 在左侧面板中点击Remote → 点击+ 符号以添加调试配置

    添加新配置后,将mode=Attach 调试到远程JVM。填写主机和端口号

    选择要调试的模块类路径,然后应用设置

    要连接,请从run 菜单运行上述远程配置。

【讨论】:

你忘记了-之前的agentlib:jdwp=... ;)【参考方案5】:

如果您使用的是 docker composer,请将以下更改应用于 Dockerfile 和 docker-compose.yml

Dockerfile

FROM openjdk:11-jdk-slim
ARG JAR_FILE=report-manager/target/*.jar
ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
COPY $JAR_FILE app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

添加ENV JAVA_TOOL_OPTIONS部分

docker-compose.yml

services:
  report-manager:
    build:
      context: .
      dockerfile: report-manager/Dockerfile/
    image: report-manager
    ports:
      - "5032:5032"
      - "5005:5005"

打开5005端口

然后创建IntelliJ Idea常用的远程调试配置,部署好docker容器后运行。

【讨论】:

以上是关于如何使用 IntelliJ 调试在 Docker 中运行的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Intellij/Rubymine 在 docker 中调试 rails 应用程序

IntelliJ IDEA 在远程机器或者 Docker 上面运行和调试你的程序

使用intellij远程调试nodejs

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

Docker容器中的Intellij CE 2018.2 + SBT:远程调试断点无法正常工作

在 IntelliJ 中,如何调试 Maven 测试目标?