当前位置: 首页 > 知识库问答 >
问题:

Spring Boot live reload在docker容器中不工作

郑嘉悦
2023-03-14

我们有一个运行在docker容器中的Spring boot gradle项目,它使用一个docker卷。Spring devtools live reload特性与以下属性一起使用。

spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=.
spring.devtools.restart.additional-exclude=src/main/java/**

我们正在使用docker卷来更改容器中的源文件。只要需要实时重新加载,文件src/main/resources/reload-trigger.txt就会更新。

集装箱日志显示,重新装载工作,但变化不影响。在重新启动容器时,会反映更改。

    null
FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN ./gradlew getDeps
EXPOSE 8000
CMD ["gradle", "bootRun", "-PskipDownload=true"]

共有1个答案

常飞翼
2023-03-14

Spring开发工具热重新加载机制仅从已构建的类文件重新加载/重新启动项目;它不会编译/构建源文件。因此在docker容器中,即使源文件被更改,Java类文件也不会被更改。因此,更改不会反映出来,新添加的GET API也不会发布。

当容器重新启动时,它再次调用DockerFile中指定的gradle bootrun。这将把更改的Java文件构建为类文件,并且更改将被反映出来。

当我们在IDE中使用它时,IDE(默认情况下)会在更改时构建源文件。因此Spring hot reload总是加载更新的类文件,但这不会在IDE之外发生,除非我们有某种机制来监视源代码更改并构建它们,比如Gradle Build--continuout

# scan for trigger file from root
# trigger file should not be in classpath, or it will go to infinite build loop
spring.devtools.restart.additional-paths=.
spring.devtools.restart.trigger-file=reload-trigger.txt

DockerFile

FROM gradle:6.7-jdk11
WORKDIR /app
COPY . /app
EXPOSE 8000

# fetch dependencies
RUN chmod +x start.sh && gradle getDeps

# script which watches source file changes in background and executes bootRun
CMD ["sh", "start.sh"]

start.sh

这个文件应该在root中,因为Dockerfile不应该在classpath中

# buildAndReload task, running in background, watches for source changes
(sleep 60; gradle buildAndReload --continuous -PskipDownload=true -x Test)&
gradle bootRun -PskipDownload=true
# -----other codes above----- #
task buildAndReload {
    dependsOn build
    mustRunAfter build    // buildAndReload must run after the source files are built into class files using build task
    doLast {
        new File(".", "reload-trigger.txt").text = "${System.currentTimeMillis()}" // update trigger file in root folder for hot reload
    }
}
 类似资料:
  • 我在Centos7机器上安装了Docker,DNS不能在容器中工作。 因此,如果我在主机上运行,它将正确解析。但是,如果我执行,我会得到: 更新:这不仅发生在busybox上,在其他平台上也是如此。我的主要问题是无法运行从以下DockerFile构建的映像容器: docker-compose.yml: 这项服务运行良好,并在我的个人机器上运行最新的Ubuntu进行了测试

  • 在使用cypress cucumber预处理器时,我的package.json中有以下内容 当我运行npm时,运行ci-test,它可以工作,所有使用@othertag的场景都会被忽略。 但却找不到任何标记。

  • 我部署了Jenkins helm的2.319.3版本,但我对集装箱码头工人有一个陌生的问题。我的Kubernetes版本:1.22.6(aks)。 错误: docker build-tregistry.azurecr.io/test: Developate-v81。无法连接到unix://var/run/的Docker守护进程docker.sock.docker守护进程正在运行吗? 测试另一个do

  • 问题内容: 我想在一个简单的Docker容器中运行Django。 首先,我使用Docker-file构建了我的容器。没有什么特别的(只有FROM,RUN和COPY命令) 然后我用命令运行容器 输入我的容器: 运行Django服务器: 得到了: 但是当我转到127.0.0.1:8000时,我什么也看不到: 没有Nginx或其他工作服务器。 我究竟做错了什么? 更新1(Dockerfile) 问题答案

  • 连接到数据库 我在那里没有看到任何桌子,除了原木 我查看了日志,changelog已经在那里工作,并且已经创建了表。

  • 问题内容: 我有这个Docker Compose配置,我只需创建一个NodeJS容器并在其中安装Angular CLI。 之后,我可以使用SSH在容器内进行SSH 。可以正常工作,但似乎不起作用。它已正确启动,控制台中没有错误。但是,如果我访问(我将端口4200映射到80),则不会加载任何内容。 我想念什么吗? 问题答案: 在您的Dockerfile中,您缺少Expose行,例如: 尝试将其放在d