最近公司的應用準備容器化,因為幾十個應用從測試到發布太麻煩了,而且還會因為環境的因素導致部署中出現各種問題。為了在開發、測試、生產都能保持一致的環境,就引進了容器技術,先拿邊緣的項目試試水,積累下經驗,今天對幾種常見的Spring Boot Docker打包工具進行了簡單總結。
Spring Boot Docker
在Spring Boot應用中,我們可以約定不同的標識來定義不同的環境。例如 dev 表示開發環境、test表示測試環境,對應的配置文件為apppcation-dev.yaml、apppcation-test.yaml。我們通過聲明spring.profiles.active來激活對應的環境配置,例如激活dev環境時spring.profiles.active=dev。完整的啟動命令為:
- java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=dev -jar spring-boot-app.jar
根據上面的命令編寫一個能夠適應多環境的Dockerfile:
- # 引入 openjdk 鏡像
- FROM adoptopenjdk/openjdk8
- # 聲明作者
- LABEL AUTHOR=felord OG=felord.cn
- # 掛載幾個有用的文件夾 比如日志
- VOLUME ["/tmp","/logs"]
- # 聲明一個環境參數用來動態啟用配置文件 默認dev
- ENV ACTIVE=dev
- # 暴露端口
- EXPOSE 8080
- # 復制并修改應用打包后的jar文件名稱
- ADD /target/flyway-spring-boot-1.0.0.jar app.jar
- # 容器啟動時第一個運行的命令 用來啟動應用
- ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]
這樣打包的Docker鏡像就可以通過docker run添加額外的--env ACTIVE=test 來動態的改變環境。單純的編寫Dockerfile不方便我們DevOps。
docker 鏡像生命周期
我們需要能夠自動地構建、推送到倉庫、拉取鏡像、運行一系列流水線操作。好在市面上有很多工具來幫助我們實現這一過程。
spring-boot-maven-plugin
這個是Spring Boot官方的插件,在2.x的某個版本提供了Docker鏡像構建能力。
- <project>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <configuration>
- <image>
- <name>docker.repo.com/library/${project.artifactId}:${project.version}</name>
- <publish>true</publish>
- </image>
- <docker>
- <publishRegistry>
- <username>user</username>
- <password>secret</password>
- <url>https://docker.repo.com/v1/</url>
- <email>[email protected]</email>
- </publishRegistry>
- </docker>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </project>
配置好Docker私倉后就可以通過mvn clean spring-boot:build-image 進行構建鏡像了。
這種方式好處就是無額外依賴,缺點就是需要從github下載構建元件,網絡如果不好就容易失敗。
Spotify Maven Plugin
Spotify Maven 插件是一個目前比較普遍的選擇。它要求應用程序開發人員編寫Dockerfile,并把Dockerfile放在項目src/main/docker目錄下。然后你就可以通過引入:
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>dockerfile-maven-plugin</artifactId>
- <version>1.4.8</version>
- <configuration>
- <repository>repo.com/${project.artifactId}</repository>
- </configuration>
- </plugin>
這個插件提供了mvn dockerfile:build、mvn dockerfile:tag、mvn dockerfile:push三個命令分別用來構建、打標簽、發布到遠端私有倉庫,非常簡單。
這個是一個非常容易上手的插件,唯一的要求就是需要會編寫Dockerfile,對定制化要求高的可以使用這個。
Jib Maven Plugin
這個曾經我在早些時候的一篇文章中已經介紹過了,可以詳細了解一下。它是谷歌開源的OCI鏡像打包工具,可以用來打包Docker鏡像,大部分情況下已經滿足需要。但是如果你要定制化的話還是不容易的,需要閱讀官方給的文檔。最開始的Dockerfile如果使用JIb的話需要這樣配置:
- <plugin>
- <groupId>com.google.cloud.tools</groupId>
- <artifactId>jib-maven-plugin</artifactId>
- <version>3.0.0</version>
- <configuration>
- <from>
- <image>adoptopenjdk/openjdk8</image>
- </from>
- <to>
- <image>docker.repo.com/library/${project.artifactId}</image>
- <auth>
- <username>felord</username>
- <password>xxxxxx</password>
- </auth>
- <tags>
- <tag>${project.version}</tag>
- </tags>
- </to>
- <extraDirectories>
- <paths>
- <path>
- <from>target/${project.artifactId}-${project.version}.jar</from>
- <includes>*.jar</includes>
- <into>/app.jar</into>
- </path>
- </paths>
- </extraDirectories>
- <containerizingMode>packaged</containerizingMode>
- <container>
- <volumes>/tmp,/logs</volumes>
- <ports>
- <port>8080</port>
- </ports>
- <environment>
- <active>dev</active>
- </environment>
- <entrypoint>
- java,-Djava.security.egd=file:/dev/./urandom,-Dspring.profiles.active=${active},-jar,/app.jar
- </entrypoint>
- <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
- </container>
- </configuration>
- </plugin>
優點是不需要本地Docker環境,而且支持分層構建、鏡像瘦身,上手容易;缺點是定制化比較困難。
到此這篇關于Spring Boot的 Docker打包插件哪個好用的文章就介紹到這了,更多相關Spring Boot Docker打包插件內容請搜索我們以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持我們!