docker - 附加到 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"
解决方案
- 要使您的应用程序“可调试”,您需要在
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005
启用选项的情况下启动它,以便 java 进程在容器进程中公开一个调试器(我假设容器中的主进程是java
进程) - 当 IntelliJ 在主机系统上运行并且您的应用程序在容器中时,您需要将端口发布到主机系统,以便 IntelliJ 可以访问调试器。
在您的情况下,我设法创建了使用自定义入口点启动图像并在容器内公开调试器的配置:
-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 名称。
- 创建一个取决于您的 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
推荐阅读
- machine-learning - 为什么要展平卷积 VAE 中的最后一个编码器层?
- servo - Coral edge TPU 连接和控制舵机的问题
- javascript - 如何访问 React 组件内部的数组?
- sql - Flutter sql:返回文本时出错[list [i],['item_name']
- python - Django HttpResponse“期望一个类似字节的对象,str找到”
- c# - 使用 Memory Stream 从第二行读取到结尾
- sql - PostgreSQL,对多行的多个日期列求和
- angular - 使用后未定义并将值保存到地图函数(Angular,TypeScript)中的数组中
- c# - 从 .NET Standard 项目的 csproj 获取所有依赖项的列表
- git - 将问题和 wiki 推送到 Github 存储库