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

时间:2015-12-08 14:03:46

标签: java intellij-idea docker remote-debugging

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

在“云端”下,我使用的是当我点击“' +”时显示的默认值。 IntelliJ文档说这应该没问题。

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

我不确定这些用途是什么,所以我不知道这些值是否合适。

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

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

5 个答案:

答案 0 :(得分:21)

Sheesh没关系。我真的不需要Docker Integration插件。这似乎更像是通过Intellij直接部署和管理Docker而不是调试。

要调试我的docker容器中运行的jetty app,我只需远程调试:

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

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

答案 1 :(得分:2)

在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的远程调试会话。

答案 2 :(得分:2)

按如下所示运行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配置步骤:

  1. 从菜单栏中单击runEdit Configurations→在左侧面板中单击Remote→单击+符号以添加调试配置< / p>

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

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

  4. 要进行连接,请从run菜单运行上面的远程配置。

example config

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您使用的是 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 容器后运行它。