【问题标题】:Spring boot gradle project in Docker with continuous buildDocker 中的 Spring Boot gradle 项目,持续构建
【发布时间】:2020-05-16 20:37:50
【问题描述】:

我创建了一个 spring starter 项目,其中 gradle 作为依赖项管理器,还包括 spring-boot-dev-tools。我的目标是创建一个 docker 映像,以便在我更改 docker 容器内的 java 文件时必须有 live reload。这适用于以下配置。

Dockerfile

FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN gradle build
EXPOSE 8080
CMD ["sh", "start.sh"]

start.sh

#!/bin/bash
gradle --version
gradle build --continuous &
gradle bootRun

这是有效的

我的一个控制器文件如下。

@RestController
public class MainController {
    @GetMapping("/")
    String test() {
        return "Test Success";
    }
}

导航到localhost:8080 时在浏览器中获得“测试成功”。当 docker 容器内的文件 /app/.../MainController.java 更改为 return "Updated"; 时,更改会自动生效。

这是问题

即使Dockerfile中有RUN gradle build,由于gradle build --continuousgradle bootRun的命令,带有此图像的docker run命令似乎正在再次下载gradle依赖项

我希望docker run 命令快,就像它已经下载了所有依赖项一样。请提出解决方法。需要实时重新加载。

【问题讨论】:

  • 您是否尝试过将主机中的 ~/.gradle 文件夹映射到容器中的 /root/.gradle ?
  • @JonathP 感谢您的支持。我已经解决了这个问题,但忘记发布答案。通过从主机映射 gradle 依赖关系,将在那里创建对主机的依赖关系,并且 Docker 映像将无法在没有 gradle 的主机上运行。

标签: spring-boot docker gradle dockerfile


【解决方案1】:

我在 Dockerfile 中使用了getDeps 选项,在 start.sh 文件中使用了skipDownload。这将在 Docker 构建期间下载所有依赖项,并且现在实时重新加载速度很快。

Dockerfile

FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app

RUN gradle --no-daemon --warning-mode all --console=plain getDeps

EXPOSE 8080
CMD ["sh", "start.sh"]

start.sh 文件

#!/bin/bash
gradle --version
gradle build --continuous -PskipDownload=true --console=plain &
gradle bootRun -PskipDownload=true --console=plain

build.gradle

// other configs
ext {
    skipDownload = project.hasProperty('skipDownload') ? project.getProperty('skipDownload') as boolean : false
}    
repositories {
    if (skipDownload) {
        flatDir {
            dirs 'libs'
        }
    } else {
        mavenCentral()
    }
}
dependencies {
    if (skipDownload) {
        implementation files('libs/spring-boot-starter-data-jdbc-2.3.7.RELEASE.jar')

    } else {
        implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jdbc', version: '2.3.7.RELEASE'

    }
}
task getDeps(type: Copy) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    from configurations.compileClasspath into "libs/"
    from configurations.runtimeClasspath into "libs/"
}

【讨论】:

  • getDeps 在哪里?另外,您如何处理本地 Gradle 依赖项?您是否在本地运行 Maven/Gradle 存储库服务?
  • @ben3000 请参阅 Dockerfile RUN gradle ..... getDeps。我不明白第二个问题。你说的本地部门是什么意思?这是一个容器,每个构建过程都发生在容器内(或 docker build 期间的中间容器)。所以我们需要做的就是从一个基本的 gradle 镜像创建镜像 - FROM gradle:5.6.2-jdk8
  • 我再次遇到了这个设置的另一个问题,并进一步改进了它。详情请看这里 - stackoverflow.com/questions/59663235/…
  • getDeps 是你开发的 gradle 任务,还是 gradle 提供的?本地依赖项是指我构建的库,我 manually publish to Maven local,有没有办法处理这个问题?
  • @ben3000 我已经用相关的 gradle 设置更新了答案。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 2021-11-01
  • 2019-02-05
  • 2021-08-01
  • 2018-09-24
  • 2018-03-29
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多