【问题标题】:attach to docker image in IntelliJ在 IntelliJ 中附加到 docker 图像
【发布时间】:2020-06-06 17:39:53
【问题描述】:

我正在尝试设置 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"

【问题讨论】:

    标签: docker debugging intellij-idea


    【解决方案1】:
    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
    

    【讨论】:

    • 谢谢。在我的辩护中,我意识到我需要在发布问题后将该命令填充到 docker 中。文笔很美。一旦我确认它附上,我会接受。
    • 好吧,既然我使用的是 spring-boot:build-image 我不能按照你建议的方式去做——命令不是 java,它使用了一些疯狂的 paketo CNB(?)层和一个客户启动器应用程序。所以我通过设置环境变量使它工作: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n
    • 另外值得注意的是,调试“在启动前启动 docker”也不起作用。它无法启动 docker 映像,出现一些关于端口不可用的奇怪错误。但是如果我手动启动 docker 然后启动调试它就可以了。好吧,实际上它不是——IntelliJ 无法打开正确的源文件。但它肯定会遇到断点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2011-05-20
    • 2011-06-05
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多