使用docker+gradle打包部署多模块springboot项目到Ubuntu服务器
有一段时间没写博客了, 最近比较忙. 前些日子朋友说想学docker, 本博客就是通过docker部署到Ubuntu服务器上的, docker可以看成一个虚拟机, 对于低配置服务器效果更加明显, 资源合理运用了. 至于更深层的好处可以去docker中文文档 看看, 这个大家应该很开心, 因为是中文, 讲的很细.
废话不多说了,开整:
1. 该流程接上次博客中创建的 多模块项目 接着搞. 多模块项目如果要加入docker必须要在主项目中引入docker插件依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
springRepo = 'https://plugins.gradle.org/m2/'
}
repositories {
maven { url springRepo }
jcenter()
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("se.transmode.gradle:gradle-docker:1.2")
}}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
上面有个坑要注意下, 仓库地址由原来的那啥地址换成了
1
https://plugins.gradle.org/m2/
因为原来的地中没有docker插件的依赖, 所以这里要注意下!
2. 开始第二步, 在入口处的依赖(gradle.build)中引入对docker插件的设置, 什么叫入口处, 就是整个多模块项目主项目的入口, 我们目前的入口是 api 模块, 所以在 api 模块下的 build.gradle
写下配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apply plugin: 'application'
apply plugin: 'docker'
jar {
baseName 'spring-boot-gradle-for-docker'
version '1.0'
}
distDocker {
baseImage 'openjdk'
maintainer 'harrison'
}
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(8081)
doFirst {
copy {
from jar
into stageDir
}
}
}
什么意思? 这里的步骤少了像市面上的Dockerfile, 我是很烦那个破文件, 放哪儿容易搞错, 这种就避免了这种尴尬问题
3. 至此配置就ojbk了! 我再上传修改过的两个文件一次, 先上主项目的 build.gradle
完整文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
def vJavaLang = '1.8'
def bootProjects = [project(':api')]
def gradleDir = "${rootProject.rootDir}/gradle"
group = 'com.keppel'
version = '0.0.1-SNAPSHOT'
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
springRepo = 'https://plugins.gradle.org/m2/'
}
repositories {
maven { url springRepo }
jcenter()
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("se.transmode.gradle:gradle-docker:1.2")
}
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
subprojects {
apply plugin: "eclipse"
apply plugin: "idea"
apply plugin: 'java'
targetCompatibility = vJavaLang
sourceCompatibility = vJavaLang
repositories {
mavenLocal()
jcenter()
mavenCentral()
}
}
configure(bootProjects) {
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
targetCompatibility = vJavaLang
sourceCompatibility = vJavaLang
repositories {
mavenLocal()
jcenter()
mavenCentral()
}
}
再上入口子模块的build.gradle
文件完整版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
jar {
baseName = 'keppel-api'
version = '0.0.1-SNAPSHOT'
}
springBoot {
mainClass = 'com.keppel.ApiApplication'
}
dependencies {
compile project(':common')
compile project(':user')
compile('io.jsonwebtoken:jjwt:0.9.0')
compile('org.springframework.boot:spring-boot-starter-mobile')
compile('org.springframework.boot:spring-boot-starter-security')
compile("org.springframework.boot:spring-boot-starter-web")
testCompile('org.springframework.boot:spring-boot-starter-test')
}
apply plugin: 'application'
apply plugin: 'docker'
jar {
baseName 'spring-boot-gradle-for-docker'
version '1.0'
}
distDocker {
baseImage 'openjdk'
maintainer 'harrison'
}
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(8081)
doFirst {
copy {
from jar
into stageDir
}
}
}
如果你开发主机为win系列的你可以直接通过idea来进行build 双击命令就可以了 镜像文件找不到在哪儿, 反正就是api.tar里面的吧 真正的是通过Ubuntu来进行打包, 贴个自己写的脚本, 亲测已经打包docker成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 进入项目目录
cd keppelfei
// 拉取最新代码
git pull
// 切换分支到主分支
git checkout master
// 开始打包啦
./gradlew clean build dockerBuilder --info
// 停止正在运行的docker镜像进行替换
docker stop gradle-boot
// 删除所有已停止的镜像
sudo docker rm $(sudo docker ps -a -q)
// 导入打包好的镜像
docker images
// 开始以gradle-boot为命名启动刚打好的镜像
docker run -d --name gradle-boot -p 8081:8081 keppel/spring-boot-gradle-for-docker:1.0
至此结束了, 有什么问题欢迎留言!
本文由作者按照 CC BY 4.0 进行授权