瘦Jar包
java 生成 jar 包一般都默認採用 fat 模式,導致生成的 jar 包很大,因爲包含了所有依賴包,傳輸的時候如果網速慢的話會很不太方便。通常,正式包發佈後,依賴 jar 包就不會太變化,變化的一般是業務邏輯,所以如果能把業務 jar 包和依賴 jar 包分開,即 thin 模式,那麼只需要每次更新業務 jar 包就行了。但 fat 也方便了本地部署,因爲就只有一個 jar 包,所以在正式版發佈前,內網測試還是應該採用 fat 模式。
項目構建文件
build.gradle
task expDepJars(type: Sync) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from System.properties['java.home'] + '/lib/ext'
from configurations.runtimeClasspath
into "$buildDir/libs/lib"
}
bootJar {
excludes = ["*.jar"]
dependsOn expDepJars
}
- 採用 Sync 類型,而不是 Copy,這樣每次會刪除已經棄用的依賴 jar 包;
- System.properties[‘java.home’] + ‘/lib/ext’ :標準 jre 額外依賴 jar 包;
- 採用 configurations.compileClasspath 會少包,所以這裏用 configurations.runtimeClasspath。
同步遠程依賴包
rsync -v -r --ignore-existing --delete build/libs/lib 192.168.12.34:/home/cloud/file/test
- ignore-existing 表示如果遠程中已經有同名 jar 包,則不重複傳輸,因爲同名依賴 jar 包一定是一樣的文件;
- delete 表示以本地爲主,對遠程進行同步,多則刪之,少則補之;
- 本地依賴 jar 包目錄 build/libs/lib 對應遠程依賴 jar 包目錄 /home/cloud/file/test/lib。
鏡像製作
項目構建文件
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath('se.transmode.gradle:gradle-docker:1.2')
}
}
apply plugin: 'docker'
group = 'java'
version = '1.8'
jar {
archivesBaseName = 'base'
archiveVersion = '1.8'
}
// use `sudo gradle build buildImage`
task buildImage(type: Docker, dependsOn: build) {
push = false
applicationName = 'base'
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
copy {
from jar
into stageDir
}
}
}
- 只需配置Docker鏡像生成任務相關;
Docker鏡像生成文件
src/main/docker/Dockerfile:
FROM openjdk:8u181-jre-alpine
VOLUME /tmp
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL", "-Dspring.config.location=/src/main/resources/config/application.yml", "-Djava.ext.dirs=/applib", "-jar", "/app.jar"]
- 業務 jar 包爲 /app.jar,額外依賴 jar 包在 /applib,配置文件都放在 /main/resources/config,這裏的路徑都是容器中的路徑;
- 這裏之所以把 application.yml 放在 /main/resources/config,是因爲項目數不多,採取每個項目一個庫,即多mysql數據源切換連接方式;
- 生成的鏡像爲:java/base:1.8。
本地生成離線鏡像:
docker save java/base:1.8 | gzip > javabase.tar.gz
主機加載離線鏡像:
docker load < javabase.tar.gz
運行實際業務
docker run -u root -d --name test -p 8080:8080 -h 192.168.12.34/test \
--restart=always --log-driver=json-file --log-opt max-size=20m --log-opt max-file=5 \
-v /home/cloud/conf/test:/src/main/resources/config \
-v /home/cloud/file/test/test-0.0.1.jar:/app.jar \
-v /home/cloud/file/test/lib:/applib \
-v /etc/localtime:/etc/localtime:ro \
java/base:1.8
- /home/cloud/file/test/test-0.0.1.jar 一般是生成的 springboot 業務 jar 包;
- /home/cloud/file/test/lib 放額外依賴 jar 包;