使用Gradle的SpringBoot应用程序的通用Docker镜像和Dockerfile

根据https://spring.io/guides/gs/spring-boot-docker/ ,我们可以使用应用程序的硬编码名称和版本为SpringBoot应用程序创buildDocker映像。 例如:

的src /主/搬运工/ Dockerfile

FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD gs-spring-boot-docker-0.1.0.jar app.jar RUN sh -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 

但是,更改应用程序的名称或版本将会破坏您放置在build.gradle任务中的Docker Build命令。

的build.gradle

 task buildDocker(type: Docker, dependsOn: build) { push = true applicationName = jar.baseName dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } } 

gradle buildDocker命令通过从应用中分级Dockerfile和可执行Jar来执行“docker build”来构build一个映像。

考虑到Dockerfile中的名称是静态的,我怎样才能改变这个设置,以便在构buildDocker镜像时更改版本,甚至是我的SpringBoot应用程序的名称都不会中断我的构build?

从Dockerfile回溯,我们可以只需要添加“app.jar”。 所以,从

 ADD gs-spring-boot-docker-0.1.0.jar app.jar 

 ADD app.jar app.jar 

这导致需要重命名或复制生成的可执行文件Jar。 这个例子把可执行的jar重命名为“app.jar”,这样就可以很容易地构buildDocker镜像。 下面是一个可以复制到Gradle中构build的SpringBoot应用程序的通用任务。

的build.gradle

 /** * Generic support for building docker images for SpringBoot Apps */ task buildDocker(type: Docker, dependsOn: build) { push = false applicationName = rootProject.name dockerfile = file('src/main/docker/Dockerfile') doFirst { // Rename the app jar to "app.jar" so that the Dockerfile does not require renames copy { from "${project.buildDir}/libs" into stageDir include "${rootProject.name}-${version}.jar" rename("${rootProject.name}-${version}.jar", "app.jar") } } doLast { println "Run the Docker Container" println "docker run -ti -p 8080:8080 $project.group/$applicationName:$version" } } 

最终生成的Dockerfile如下所示:

的src /主/搬运工/ Dockerfile

 FROM frolvlad/alpine-oraclejdk8:slim MAINTAINER Marcello_deSales@intuit.com VOLUME /tmp ADD app.jar app.jar RUN sh -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 

命令“gradle buildDocker”将生成docker镜像,并作为奖励,将打印完整的命令供您执行应用程序(请注意,默认端口号是硬编码的,如果您更改该值,则必须更改)。