我有一个包含集成测试的maven项目,我使用surefire插件。我可以运行测试
mvn clean package
这工作正常。我还可以使用 intellij 远程调试集成测试。为此,我执行
mvn clean package -Dmaven.surefire.debug
在Intellij中,我创建了一个类型为"远程"的运行/调试配置,将主机设置为本地主机,将端口设置为5005。一旦控制台打印
Listening for transport dt_socket at address: 5005
我在 intellij 中启动远程调试,一切正常。
问题是我想在 docker 容器内执行集成测试,尤其是在容器内调试它们。我已经用java,maven和我的应用程序需要的所有其他东西创建了一个docker镜像。在入口点中,我启动我的应用程序,然后我开始集成测试
mvn clean package -Dmaven.surefire.debug
在码头工人容器内。我使用选项运行 docker 容器
-p 5005:5005
以打开该端口以进行远程调试。运行容器时,在某些时候我可以看到控制台输出
Listening for transport dt_socket at address: 5005
但是当我在 intellij 中启动远程调试器时,它不会连接,而是给我以下错误消息
Error running '...':
Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset"
如果我再次尝试启动调试器,我会收到错误消息
Unable to open debugger port (localhost:5005): java.net.IOException "handshake failed - connection prematurally closed"
但是端口应该是开放的,因为执行
nc -zv localhost 5005
在主机 (Netcat( 中,结果为
Connection to localhost 5005 port [tcp/*] succeeded!
但是,如果在 docker 容器内执行相同的 netcat 命令,则会导致
localhost [...] 5005 (?) : Connection refused
谁能告诉我我做错了什么?我不坚持使用 intellij 进行调试,但能够以某种方式调试 docker 容器内的测试会很棒。
答案实际上可以在这里找到: 在 IntelliJ IDEA 的 docker 容器中远程调试 Java 9
就我而言,这意味着运行测试
mvn clean package -Dmaven.surefire.debug="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=*:5005"
解决问题