目前在github上看到的spring cloud project中大部分都是使用maven來建立專案
使用gradle的不太多,更別說是使用gradle將spring cloud service打包成docker image
因此花了一些時間研究一下如何使用gradle直接建立docker image而不是透過DockerFile
目前找到一個可以直接將springBootApplication打包成docker image的plugin
在此先看一下目錄結構
第一步先來到spring-cloud project (root)下設置gradle檔案
第10行引入”com.bmuschko:gradle-docker-plugin:5.3.0”才可以讓gradle script實現打包docker image的功能
第19行引入apply plugin: “com.bmuschko.docker-spring-boot-application”讓整個sub project中的module都可以使用
1 | buildscript { |
root project下的settings.gradle也要記得設定使用哪些module,不然subprojects區塊內的效果不會引入
1 | rootProject.name = 'spring-cloud' |
第二步來到eureka module下的gradle檔案中設置
第8~14行打包docker成docker images,baseImage指定docker image,ports指定預設docker image exposed ports
還有其他的應用和設定可以查看文件:
https://bmuschko.github.io/gradle-docker-plugin/
此例子是直接使用文件中第4節所提到的springBootApplication的打包功能
1 | dependencies { |
第三步實現在docker中動態傳參數的效果
來到eureka module下的application.yml檔案中動態設置hostname
在此使用環境變量${EUREKA_HOST:localhost},此語法為若環境變量中有EUREKA_HOST就使用其內容,若無則使用預設值localhost
未來可在docker下動態設置環境變量來達成傳參的效果
1 | server: |
設置docker-compose目錄下的spring-cloud.env檔
內容中EUREKA_HOST指定hostname為sc-eureka,sc是spring cloud的意思
1 | ## docker-compose |
設置docker-compose目錄下的docker-compose.yml
第27~34行為eureka module於docker建立container時的設定
第34行env_file指定spring-cloud.env為變數時,會將EUREKA_HOST=sc-eureka設為docker的環境變數
因此eureka module下的application.yml也會將hostname: ${EUREKA_HOST:localhost}值設為sc-eureka而不是預設的localhost
1 | version: '3' |
最後來到spring-cloud目錄(root)下設定eureka.sh
第4~8行移動到eureka module下執行gradle DockerBuildImage會觸發gradle下的docker{…}的打包作業
第14~17行移動到docker-compose目錄下指定執行eureka (daemon),會依據docker-compose.yml設定環境變數
並且啟動docker container
1 |
|
執行docker ps看到sc-eureka container已啟動