Spring Boot 的 Docker 打包插件哪個好用
最近公司的應用準備容器化,因爲幾十個應用從測試到發佈太麻煩了,而且還會因爲環境的因素導致部署中出現各種問題。爲了在開發、測試、生產都能保持一致的環境,就引進了容器技術,先拿邊緣的項目試試水,積累下經驗,今天對幾種常見的 Spring Boot Docker 打包工具進行了簡單總結。
Spring Boot Docker
在 Spring Boot 應用中,我們可以約定不同的標識來定義不同的環境。例如 dev
表示開發環境、test
表示測試環境,對應的配置文件爲application-dev.yaml
、application-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。
我們需要能夠自動地構建、推送到倉庫、拉取鏡像、運行一系列流水線操作。好在市面上有很多工具來幫助我們實現這一過程。
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>user@example.com</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 環境,而且支持分層構建、鏡像瘦身,上手容易;缺點是定製化比較困難。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/x-ut-QT8sa0UVR1qk3qYHg