文章目录

  • IDEA 使用Gradle构建Spring Boot项目并配置Docker
  • 1. 在IDEA中使用Gradle构建Spring Boot项目
  • 利用IDEA Gradle插件打包项目
  • 2. Gradle配置Docker
  • 2.1 IDEA Docker插件配置
  • 2.2 com.bmuschko.docker-spring-boot-application
  • 2.2.1 使用IDEA配置Docker插件完成项目Docker容器部署
  • 2.3 com.palantir.docker


IDEA 使用Gradle构建Spring Boot项目并配置Docker

例程环境说明:
系统:Windows10
IDE:IntelliJ IDEA 2020.3.3 (Ultimate Edition)
Java版本:java11
构建工具:Gradle

1. 在IDEA中使用Gradle构建Spring Boot项目

打开IDEA选择File->New->Project…

如何用gradle打包docker镜像 gradle docker_idea


选择Spring Initializr,Project-SDK 我们这里选择JDK11

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_02


在新建窗口中,依照下图填写相应的内容

如何用gradle打包docker镜像 gradle docker_jdk11_03


项目依赖我们选择Spring Web和Thymeleaf

如何用gradle打包docker镜像 gradle docker_docker_04


之后点击Next->Finished 完成项目的创建,项目创建完毕后如下图所示:

如何用gradle打包docker镜像 gradle docker_idea_05


初次构建项目有可能会花费较多时间

项目的根目录,我们可以看到build.gradle文件,这个是项目的构建脚本,我们可以更改Maven镜像仓库来提升依赖包的下载速度。把项目的Maven镜像仓库改为国内阿里云的,下面为该项目的gradle配置

// 使用插件
plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
// 指定了生生成的编译文件的版本,默认为jar包
group = 'com.stackstone.demo'
version = '1.0.0'

// 指定编译.java文件的JDK版本
sourceCompatibility = '11'

// 使用了Maven的中央仓库(可以指定其他仓库)
repositories {
//    mavenCentral()
    // 阿里云镜像仓库
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}

// 依赖关系
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

// 测试
test {
    useJUnitPlatform()
}

新建controller包,编写HelloController.java

package com.stackstone.study.hellodocker.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {
    @GetMapping("/")
    public String hello(Model model) {
        model.addAttribute("hi", "HelloWorld!");
        return "hello";
    }
}

之后在项目中resources目录下的templates新建hello.html页面内容如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello World</title>
</head>
<body>
<h1 th:text="${hi}"></h1>
</body>
</html>

之后运行项目

如何用gradle打包docker镜像 gradle docker_gradle_06


控制台打印如下内容表示项目启动成功:

如何用gradle打包docker镜像 gradle docker_docker_07


浏览器访问:localhost:8080,会出现如下Hello World页面

如何用gradle打包docker镜像 gradle docker_docker_08

利用IDEA Gradle插件打包项目

如下图所示,IDEA的Gradle插件会列举一些gradle命令,我们运行bootJar后,项目中会生成build文件夹,在libs中可以找到我们项目打包的jar包。拷贝出来后java -jar运行该jar包即可启动项目

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_09

以上代码例程地址:https://github.com/lt5227/gradle-docker-demo/tree/basic_demo

2. Gradle配置Docker

Gradle管理配置Docker的插件有一些,这里分别介绍两款插件的配置和使用。为了方便集成IDEA的使用,我们先配置IDEA的Docker插件。

2.1 IDEA Docker插件配置

右键下图所示的Docker图标,选择Settings

如何用gradle打包docker镜像 gradle docker_docker_10


在General里面勾选Expose daemon on tcp://localhost:2375 without TLS之后应用重启服务

如何用gradle打包docker镜像 gradle docker_gradle_11


在IDEA中打开Docker设置面板,如下图所示勾选填写相应信息,之后测试配置,如果提示成功则说明配置正确点击OK即可。

如何用gradle打包docker镜像 gradle docker_jdk11_12

2.2 com.bmuschko.docker-spring-boot-application

该插件的GIT地址:https://github.com/bmuschko/gradle-docker-plugin 插件地址:https://plugins.gradle.org/plugin/com.bmuschko.docker-spring-boot-application 根据官方文档的说明,我们将build.gradle文件更改如下:

// 使用插件
plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'com.bmuschko.docker-spring-boot-application' version '6.7.0'
}
// 指定了生生成的编译文件的版本,默认为jar包
group = 'com.stackstone.demo'
version = '1.0.0'

// 指定编译.java文件的JDK版本
sourceCompatibility = '11'

// 使用了Maven的中央仓库(可以指定其他仓库)
repositories {
//    mavenCentral()
    // 阿里云镜像仓库
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}

// 依赖关系
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    docker {
        springBootApplication {
            // 使用JDK11基础镜像,如果是JDK8 使用:'openjdk:8-alpine'
            baseImage = 'adoptopenjdk/openjdk11:ubi'
            ports = [8080]
            images = ["${project.group}/${bootJar.archiveBaseName.get()}:${bootJar.archiveVersion.get()}"]
            jvmArgs = ['-Djava.security.egd=file:/dev/./urandom', '-Xmx2048m']
        }
        url = 'tcp://127.0.0.1:2375'
    }
}

// 测试
test {
    useJUnitPlatform()
}

之后在IDEA的Gradle面板重新加载项目,会出现如下所示的Tasks。

如何用gradle打包docker镜像 gradle docker_jdk11_13


我们运行dockerBuildImage,初次构建时间会比较长,我这里大约花费了7分钟多。

如何用gradle打包docker镜像 gradle docker_docker_14


构建完毕后,我们就可以在Docker Desktop中看到我们构建的image,如下所示:

如何用gradle打包docker镜像 gradle docker_gradle_15


启动的话可以在控制台输入命令:

docker run -p 8080:8080 -t com.stackstone.demo/hello:1.0.0

如下所示:

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_16



2.2.1 使用IDEA配置Docker插件完成项目Docker容器部署

也可以利用IDEA的docker插件进行配置启动:

选择Edit Configurations...

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_17


添加新的配置

如何用gradle打包docker镜像 gradle docker_gradle_18


选择Docker->Dockerfile

如何用gradle打包docker镜像 gradle docker_jdk11_19


如下图所示填写相应配置信息之后点击OK

如何用gradle打包docker镜像 gradle docker_docker_20


配置好后点击运行

如何用gradle打包docker镜像 gradle docker_jdk11_21


之后我们在Services窗口可以看到如下信息:

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_22


表示Docker启动成功,在windows的Docker Desktop中也可以看到生成的容器

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_23


我们也可以选择Docker->DockerImage,按下图方式填写配置

如何用gradle打包docker镜像 gradle docker_docker_24


图中的Image Id可以在如下所示的页面中查询到。

如何用gradle打包docker镜像 gradle docker_jdk11_25


配置完后启动即可~。

以上代码Demo: https://github.com/lt5227/gradle-docker-demo/tree/docker-plugin_1

2.3 com.palantir.docker

该插件的GIT地址:https://github.com/palantir/gradle-docker 插件地址:https://plugins.gradle.org/plugin/com.palantir.docker

首先在项目中手工创建Dockerfile文件,内容如下所示

FROM adoptopenjdk/openjdk11:ubi
VOLUME /tmp
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

修改项目build.gradle

// 使用插件
plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'com.palantir.docker' version '0.26.0'
}
// 指定了生生成的编译文件的版本,默认为jar包
group = 'com.stackstone.demo'
version = '1.0.0'

// 指定编译.java文件的JDK版本
sourceCompatibility = '11'

// 使用了Maven的中央仓库(可以指定其他仓库)
repositories {
//    mavenCentral()
    // 阿里云镜像仓库
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}

// 依赖关系
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

docker {
    name "${project.group}/${bootJar.archiveBaseName.get()}"
    files bootJar.archiveFile.get().asFile
    buildArgs(['JAR_FILE': "${bootJar.archiveFileName.get()}"])
}

// 测试
test {
    useJUnitPlatform()
}

之后我们点击下图所示的按钮,构建image

如何用gradle打包docker镜像 gradle docker_如何用gradle打包docker镜像_26


构建Docker image我们也可以自己手工输入命令

gradle build docker --info

构建成功后可以在Docker管理页面看到添加的image

如何用gradle打包docker镜像 gradle docker_docker_27