使用 Gradle 构建 Spring-Boot 的 Docker 镜像

通常我们使用 Dockerfile 来构建项目的Docker 镜像,但是也有需求希望使用 gralde 在编译项目的时候一起把镜像给构建并上传,所以该教程讲解了使用 gradle 编写配置 Dockerfile 并生成镜像的过程。

1. 添加依赖

教程使用gradle-docker插件来实现,在 Gradle 的脚本里配置 dockerfile 的构建镜像功能。

gradle-docker插件已经包含在 jCenterMavenCentral中。所以只需要在dependencies添加依赖就能使用 docker 插件。

build.gradle中的配置如下,其他配置省略:

buildscript {
   ...
    dependencies {
        //添加gradle-docker 依赖,版本1.2
        classpath 'se.transmode.gradle:gradle-docker:1.2'
    }
}
2. 应用插件

添加以下代码到 build.gradle

apply plugin: 'application' //可选配置
apply plugin: 'docker'

如果添加了application插件的话,默认gradle-docker插件会添加一个distDocker的 gralde task,用来构建一个包含所有程序文件的 docker 镜像。

3. 配置镜像构建信息
  • 配置 group:
group = 'my-group'
  • 配置镜像名字和版本号:
jar {
    baseName = 'spring-boot-docker'
    version = '1.2.3'
}

配置了以上信息之后,构建的 Docker 镜像名就是:my-group/spring-boot-docker:1.2.3,可以根据实际需要进行修改。

  • 配置 docker 构建基础信息:
docker {
    baseImage 'frolvlad/alpine-oraclejdk8:slim'
    maintainer 'mcjiffy mcjiffy@mcjiffy'
    registry 'localhost:5000'
}

其中,baseImage相当于Dockerfile 中声明的 FROM。声明了在构建镜像是基于的 Image,maintainer相当于MAINTAINER声明了镜像作者。如果声明了registry地址,插件在镜像射生成后可以自动 push到该地址。其他还可以配置 docker hub 的地址、用户名和密码,用来生成镜像后自动 push。

4. 添加task 任务

完成了配置,我们还需要添加一个task 用来在gradle 编译的时候能够执行镜像的构建。
插件提供了一些转换方法,用来指代Dockerfile中的关键词语法,如下表,可以按照需求对照着来:

Dockerfile 关键词gradle task 方法
ADDaddFile(Closure copySpec)
addFile(String source, String dest)
addFile(File source, String dest)
CMDdefaultCommand(List cmd)
ENTRYPOINTentryPoint(List entryPoint)
ENVsetEnvironment(String key, String val)
EXPOSEexposePort(Integer port)
exposePort(String port)
RUNrunCommand(String cmd)
USERswitchUser(String userNameOrUid)
VOLUMEvolume(String… paths)
WORKDIRworkingDir(String dir)
  • 构建 spring-boot 项目 task 示例:
task dockerBuilder(type: Docker) {
    applicationName = jar.baseName
    tagVersion = jar.version
    volume('/tmp')
    addFile("${jar.baseName}-${jar.version}.jar","app.jar")
    entryPoint(["java","-Djava.security.egd=file:/dev/./urandom","-jar",'app.jar'])
    exposePort(8022)
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

其中 applicationName和 tagVersion配置了插件生成镜像名称和 tag 的信息,默认插件配置为tag = "${project.group}/${applicationName}:${tagVersion}",也可以自己指定固定值。

以上的 task 等同于Dockerfile

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD spring-boot-docker-1.2.3.jar app.jar
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom","-jar","app.jar" ]
EXPOSE 8022

一个基础的 Spring-Boot 生成 docker 镜像的配置。

  • 在 task 中使用已有的 Dockerfile
    如果觉的在 task 中编写Dockerfile替换脚本非常别扭,也可以直接在 task中指定Dockfile的文件路径,直接使用已有的文件来生成镜像:
task buildDocker(type: Docker) {
    applicationName = jar.baseName
    tagVersion = jar.version
    dockerfile = file('Dockerfile')
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

指定task 使用位于项目根目录的Dockerfile来生产镜像。

5.编译并构建 Spring-Boot 项目的 Docker 镜像

控制台中执行命令:./gradlew clean build dockerBuilder --info
等待出现BUILD SUCCESSFUL就证明编译成功了。
使用docker images命令可以看到新生成了一个名为my-group/spring-boot-docker,tag 是1.2.3的镜像。

6. 其他用法

gradle-docker插件还提供了配置仓库地址、配置使用 Docker Remote Api 和 Docker Hub等用法,可以参考该项目的 GitHub 地址来进行配置使用:
https://github.com/Transmode/gradle-docker

    原文作者:mcjiffy
    原文地址: https://www.jianshu.com/p/02f5ace76539
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞