Spring boot Docker中具有连续构建的Spring boot gradle项目
我创建了一个springstarter项目,其中gradle作为依赖项管理器,还包括springbootdev工具。我的目标是创建一个docker映像,这样每当我在docker容器中更改java文件时,都必须进行实时重新加载。这在以下配置中运行良好 DockerfileSpring boot Docker中具有连续构建的Spring boot gradle项目,spring-boot,docker,gradle,dockerfile,Spring Boot,Docker,Gradle,Dockerfile,我创建了一个springstarter项目,其中gradle作为依赖项管理器,还包括springbootdev工具。我的目标是创建一个docker映像,这样每当我在docker容器中更改java文件时,都必须进行实时重新加载。这在以下配置中运行良好 Dockerfile FROM gradle:5.6.2-jdk8 WORKDIR /app COPY . /app RUN gradle build EXPOSE 8080 CMD ["sh", "start.sh"] FROM gradle:5
FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN gradle build
EXPOSE 8080
CMD ["sh", "start.sh"]
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"]
#!/bin/bash
gradle --version
gradle build --continuous -PskipDownload=true --console=plain &
gradle bootRun -PskipDownload=true --console=plain
// 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/"
}
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
更改为说,返回“已更新”代码>,更改将自动影响
这就是问题所在
FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN gradle build
EXPOSE 8080
CMD ["sh", "start.sh"]
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"]
#!/bin/bash
gradle --version
gradle build --continuous -PskipDownload=true --console=plain &
gradle bootRun -PskipDownload=true --console=plain
// 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/"
}
即使Dockerfile中有RUN gradle build
,带有此图像的docker RUN
命令似乎是再次下载gradle依赖项,因为命令gradle build--continuous
或gradle bootRun
我想要快速运行docker
命令,就像它已经下载了所有依赖项一样。请提出解决办法。需要实时重新加载。我在Dockerfile中使用了getDeps
选项,并在start.sh文件中使用了skipDownload
。这将在Docker构建期间下载所有依赖项,实时重新加载现在很快
Dockerfile
FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN gradle build
EXPOSE 8080
CMD ["sh", "start.sh"]
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"]
#!/bin/bash
gradle --version
gradle build --continuous -PskipDownload=true --console=plain &
gradle bootRun -PskipDownload=true --console=plain
// 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/"
}
start.sh文件
FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN gradle build
EXPOSE 8080
CMD ["sh", "start.sh"]
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"]
#!/bin/bash
gradle --version
gradle build --continuous -PskipDownload=true --console=plain &
gradle bootRun -PskipDownload=true --console=plain
// 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/"
}
build.gradle
FROM gradle:5.6.2-jdk8
WORKDIR /app
COPY . /app
RUN gradle build
EXPOSE 8080
CMD ["sh", "start.sh"]
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"]
#!/bin/bash
gradle --version
gradle build --continuous -PskipDownload=true --console=plain &
gradle bootRun -PskipDownload=true --console=plain
// 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/"
}
您是否尝试将您的~/.gradle文件夹从主机映射到容器中的/root/.gradle?@JonathP感谢您的支持。我已经解决了这个问题,但忘了把答案贴出来。通过从主机映射gradle依赖项,将在那里创建到主机的依赖项,没有gradle Docker映像将无法在主机中运行。getDeps在哪里?另外,您如何处理本地Gradle依赖关系?您是否在prem上运行Maven/Gradle存储库服务?@ben3000请查看Dockerfilerun Gradle。。。。。getDeps
。我不明白第二个问题。你说的地方副局长是什么意思?这是一个容器,每个构建过程都发生在容器内部(或docker构建期间的中间容器)。因此,我们需要做的就是从一个基本的gradle映像创建映像-来自gradle:5.6.2-jdk8
。我再次遇到了这个设置的另一个问题,并进一步改进了它。有关详细信息,请参阅此页-getDeps
是您开发的gradle任务,还是gradle提供的任务?说到本地依赖性,我指的是我构建的库,有没有办法处理这个问题?@ben3000我已经用相关的gradle设置更新了答案。谢谢你指出这一点。