【springboot】使用gradle生成Spring Boot应用的Docker Image
背景
- 随着微服务化,使服务越来越多,而部署服务更是一个麻烦的工作,项目部署实现docker趋势,docker 镜像有时我们必须的组件.而把springboot应用生成docker镜像就是此博客需要做的事情.
最终效果
- 生成的镜像
- 运行容器
- 容器运行后的日志
是不是项目运行的日志,这就证明我们把springboot应用通过docker部署起来了
配置
build.gradle
/**
* ===================================================================================================================
* ------------------------------------------- 引入项目插件 ----------------------------------------------
* ===================================================================================================================
*/
buildscript {
ext {
springBootVersion = '2.2.6.RELEASE'
}
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") //springboot-gradle插件
classpath("se.transmode.gradle:gradle-docker:1.2") //docker插件
}
}
plugins {
id 'org.springframework.boot' version "${springBootVersion}" //spring提供的spring boot插件,主要用到了其依赖管理的功能.
id 'io.spring.dependency-management' version '1.0.9.RELEASE' //spring jar版本管理
id 'java' //java插件
id 'maven-publish' //该插件可以将打包的jar发送到maven库
}
/**
* ===================================================================================================================
* ------------------------------------------- 所有项目的通用配置 ----------------------------------------------
* ===================================================================================================================
*/
configure(allprojects) { project ->
//项目基础属性
group 'com.emodernhy' //项目所属组织
version '1.0-SNAPSHOT' //项目版本号
//引入插件
apply from: "${rootProject.rootDir}/dependency.gradle" //引入jar包版本配置文件
apply plugin: 'java' //java插件
apply plugin: 'maven' //maven插件
apply plugin: 'idea' //IDEA插件
apply plugin: 'eclipse' //eclipse插件
apply plugin: 'org.springframework.boot' //spring boot插件
apply plugin: 'io.spring.dependency-management' //实现maven的依赖统一管理功能
apply plugin: 'application' //docker插件引用
apply plugin: 'docker' //引入docker插件
//JDK版本声明
sourceCompatibility = custom.version.JDK
targetCompatibility = custom.version.JDK
//默认启动类
mainClassName = "com.emodernhy.generator.GeneratorApplication"
//配置仓库
repositories {
mavenLocal()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven { url 'https://repo.spring.io/libs-snapshot' }
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
mavenCentral()
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
}
//指定项目编码
tasks.withType(JavaCompile) {
options.encoding = "${custom.encoding.OPTIONS}"
}
//在多模块下,授权打包依赖模块
jar {
enabled = true
}
//重打包基础配置
bootJar {
launchScript()
archivesBaseName = "${project.name}"
}
//docker配置
distDocker {
baseImage "registry.cn-hangzhou.aliyuncs.com/emodernhy/jdk"
maintainer 'hbsky2015@aliyun.com bo_huang'
}
}
/**
* ===================================================================================================================
* ------------------------------------------- 所有所有项目的通用配置 ---------------------------------------------
* ===================================================================================================================
*/
configure(allprojects) {
project ->
dependencyManagement {
//定义版本
dependencies {
/**
* lombok
*/
dependency "org.projectlombok:lombok:${custom.version.LOMBOK}"
/**
* hutool工具类
*/
dependency "cn.hutool:hutool-all:${custom.version.HUTOOL}"
/**
* HikariCP数据库连接池
*/
dependency "com.zaxxer:HikariCP:${custom.version.HIKARI_CP}"
/**
* mysql数据库驱动
*/
dependency "mysql:mysql-connector-java:${custom.version.MYSQL}"
/**
* commons-lang3
*/
dependency "org.apache.commons:commons-lang3:${custom.version.APACHE_COMMON_LANG3}"
/**
* MyBatis-Plus 的代码生成器
*/
dependency "com.baomidou:mybatis-plus-generator:${custom.version.MYBATIS_PLUS}"
}
}
}
configure(allprojects) {
project ->
/**
* -============================================================================================================
* -=====================================模块的公共依赖==================================================
* -============================================================================================================
*/
dependencies {
/**
* -=================================================================================-
* - ******************** 基本相关依赖 *************************** -
* -=================================================================================-
*/
//使用lombok来简化掉编码过程中的通用的方法.
annotationProcessor 'org.projectlombok:lombok'
compileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
//commons-lang3工具包
implementation 'org.apache.commons:commons-lang3'
//工具包
implementation('cn.hutool:hutool-all')
/**
* -=================================================================================-
* - ******************** springboot相关jar *************************** -
* -=================================================================================-
*/
implementation 'org.springframework.boot:spring-boot-starter'
//web
implementation 'org.springframework.boot:spring-boot-starter-web'
//test
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
//apo
implementation 'org.springframework.boot:spring-boot-starter-aop'
//yml,properties配置文件有提示
implementation 'org.springframework.boot:spring-boot-configuration-processor'
/**
* -=================================================================================-
* - ******************** 数据库相关jar *************************** -
* -=================================================================================-
*/
//MyBatis-Plus 的代码生成器
implementation 'com.baomidou:mybatis-plus-generator'
//velocity模板
implementation 'org.apache.velocity:velocity-engine-core:2.2'
//mysql数据库驱动
implementation 'mysql:mysql-connector-java'
//连接池
implementation 'com.zaxxer:HikariCP'
/**
* -=================================================================================-
* - ******************** 其他相关jar *************************** -
* -=================================================================================-
*/
//日志性能监控
implementation 'org.perf4j:perf4j:0.9.16'
}
}
详解
- 引入插件
buildscript {
ext {
springBootVersion = '2.2.6.RELEASE'
}
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") //springboot-gradle插件
classpath("se.transmode.gradle:gradle-docker:1.2") //docker插件
}
}
apply plugin: 'application' //docker插件引用
apply plugin: 'docker' //引入docker插件
注意:如果添加了application插件的话,默认gradle-docker插件会添加一个distDocker的 gralde task,用来构建一个包含所有程序文件的 docker 镜像
- 配置main启动类(也就是springboot main启动类全路径)
mainClassName = "com.emodernhy.generator.GeneratorApplication"
- docker插件的使用
-
- 最简单的配置
//docker配置
distDocker {
baseImage "registry.cn-hangzhou.aliyuncs.com/emodernhy/jdk"
maintainer 'hbsky2015@aliyun.com bo_huang'
}
这样的配置,镜像名会使用项目名,镜像版本会使用项目版本,暴露端口就是项目运行端口
-
- 详细配置
//docker配置
distDocker {
baseImage "registry.cn-hangzhou.aliyuncs.com/emodernhy/jdk"
maintainer 'hbsky2015@aliyun.com bo_huang'
tag "emondernhy_test"
version 1.1
setEnvironment("JAVA_OPTS", "-Dspring.profiles.active=test")
}
这里我修改了镜像名称和镜像版本,也加入的程序运行的环境变量
-
- Dockerfiles 包含一些有关image相应的指令要求
Dockerfile关键词 | gradle-task方法 |
---|---|
ADD | addFile(Closure copySpec) |
ADD | addFile(String source, String dest) |
ADD | addFile(File source, String dest) |
CMD | defaultCommand(List cmd) |
ENTRYPOINT | entryPoint(List entryPoint) |
ENV | setEnvironment(String key, String val) |
EXPOSE | exposePort(Integer port) |
EXPOSE | exposePort(String port) |
RUN | runCommand(String cmd) |
USER | switchUser(String userNameOrUid) |
VOLUME | volume(String… paths) |
WORKDIR | workingDir(String dir) |
-
- 如果需要使用 Dockerfile
//docker配置
distDocker {
dockerfile("Dockerfile")
}
里面放Dockerfile路径
执行
这里就生成你的镜像了
镜像内部结构
- emodernhy_generator-1.0-SNAPSHOT : springboot应用程序
-
- bin springboot运行脚本
-
- lib 程序所有的jar
- output: 我自己配置日志文件目录