您的位置:首页 > 运维架构 > Docker

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

2019-06-10 16:57 686 查看

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

1. 添加依赖

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

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

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

[code]buildscript {
...
dependencies {
//添加gradle-docker 依赖,版本1.2
classpath 'se.transmode.gradle:gradle-docker:1.2'
}
}

2. 应用插件

添加以下代码到

build.gradle

[code]apply plugin: 'application' //可选配置
apply plugin: 'docker'

如果添加了

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

3. 配置镜像构建信息

  • 配置 group:
[code]group = 'my-group'
  • 配置镜像名字和版本号:
[code]jar {
baseName = 'spring-boot-docker'
version = '1.2.3'
}

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

  • 配置 docker 构建基础信息:
[code]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 方法
ADD addFile(Closure copySpec)
  addFile(String source, String dest)
  addFile(File source, String dest)
CMD defaultCommand(List cmd)
ENTRYPOINT entryPoint(List entryPoint)
ENV setEnvironment(String key, String val)
EXPOSE exposePort(Integer port)
  exposePort(String port)
RUN runCommand(String cmd)
USER switchUser(String userNameOrUid)
VOLUME volume(String... paths)
WORKDIR workingDir(String dir)
  • 构建 spring-boot 项目 task 示例:
[code]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

[code]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
    的文件路径,直接使用已有的文件来生成镜像:
[code]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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: