【问题标题】:Debugging Java application on Docker在 Docker 上调试 Java 应用程序
【发布时间】:2019-02-15 20:28:47
【问题描述】:

我正在调查一个托管在 Docker 服务中的 Java 应用程序的问题。该应用程序是一个拥有自己的 docker 服务的 REST API

我添加了额外的日志记录并查看了服务日志,以及执行到容器中并查看了那里的日志,但这只会让我到达某个点。

有什么方法可以附加远程调试器或类似的东西,以便我可以单步执行应用程序的代码?

【问题讨论】:

  • 查看stackoverflow.com/questions/975271/…,但请注意,您不应该在生产环境中这样做
  • 根据您使用的容器,您应该更改容器启动的命令。通常您可以添加传递 JAVA_OPT 环境变量的参数。你能提供更多关于容器的信息吗?
  • @GianlucaMereu 我的应用程序是使用定义了三个不同服务的 docker compose 文件部署的。其中一项服务是我想要调试的。
  • 查看此链接了解详细步骤 访问 stackoverflow.com/a/61660010/1734444>?

标签: java docker debugging intellij-idea


【解决方案1】:

Dockerfile 例如:

FROM openjdk:11.0.1-jdk
VOLUME /tmp
COPY build/libs/*.jar app.jar
EXPOSE 5005
EXPOSE 8080
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-Dspring.profiles.active=localdocker","-jar","/app.jar"]

然后通过 Idea 或 Eclipse 的远程调试器进行连接

【讨论】:

  • 这行得通。我在地址=*:5005 中缺少 *。谢谢!
【解决方案2】:

如果您执行以下操作,您也可以保持 docker 文件不变:

VOLUME /tmp
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java"]
CMD ["-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-Dspring.profiles.active=localdocker","-jar","/app.jar"]

然后在终端上传递必要的参数

docker run -p 5005:5005 <my-container> -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005, -Dspring.profiles.active=localdocker,-jar,/app.jar

这是 jdwp 的连接选项的文档。 https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.html#Transports

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 2018-02-15
    • 1970-01-01
    • 2016-07-25
    • 2021-02-04
    • 2020-03-03
    • 2020-04-21
    • 2010-11-01
    相关资源
    最近更新 更多