【问题标题】:hot reload java program running in docker在 docker 中运行的热重载 java 程序
【发布时间】:2019-08-14 18:58:17
【问题描述】:

我开发了一个应该在 docker 中运行的 java 程序。但是,在调试我在 docker 中运行的 java 程序时,我遇到了很多痛苦。

我在网上搜索,一些教程提出了spring-dev-tools之类的工具(因为我的java程序是一个基于spring-boot的程序)。

https://www.youtube.com/watch?v=sz5Zv5QQ5ek

根据那些教程,调试是可以的,例如设置断点和变量监视,但是,当我更新我的代码(例如,某些类)时,这些更改无法立即反映在 docker 中运行的程序中,程序表现为旧代码。

谁能给点提示?

【问题讨论】:

  • 在 Docker 中运行时是否有任何理由调试/更新应用程序?更好的方法可能是进行本地设置,易于启动和修补(就像从 IDE 启动一样),直到开发结束。
  • 调试器必须热部署更改的代码
  • @nucandrei 感谢您的回复。原因是程序与主机系统有一些交互,另外,我使用 mac 进行开发,使用本地设置可能不适合。一般来说,它不是一个独立的 CRUD 应用程序,因此我必须首先将它放在 docker 中。

标签: java spring-boot docker


【解决方案1】:

我通过以下方式成功完成了这项工作:

  1. 在运行时将源代码挂载到容器中
  2. 使用远程调试器连接

这是我的 dockerfile:

FROM gradle:5.4-jdk12
WORKDIR /app
EXPOSE 8080 5005

这是我的 docker-compose.yml:

version: '3'
services:
  app:
    build:
      context: .
    ports:
      - 5005:5005
      - 8080:8080
    volumes:
      - .:/app
    command: ["gradle", "bootRun"]

当我使用docker-compose up 运行它,然后连接远程调试器时,热重载工作。

我是从 Intellij 连接的,所以我必须重建项目才能使热重载工作。

【讨论】:

  • 感谢您的回复,我首先连接到 5005 端口,然后单击“运行”,然后单击“重新加载更改的类”。但这似乎适用于有限的代码更改,例如,如果我们添加一个类,这个技巧将不起作用。
  • 好的,所以,我最初只安装了源文件,并没有看到反映的更改。但是在这种方法中,您只是安装了整个工作区。因此,每当发生更改时,IntelliJ 都会编译这些类并重新加载 DevTools。要使热重载起作用,应该更改类文件而不仅仅是源文件!谢谢顺便说一句。
猜你喜欢
  • 2019-04-13
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
相关资源
最近更新 更多