Spring Boot 的 Docker 打包插件哪個好用

最近公司的應用準備容器化,因爲幾十個應用從測試到發佈太麻煩了,而且還會因爲環境的因素導致部署中出現各種問題。爲了在開發、測試、生產都能保持一致的環境,就引進了容器技術,先拿邊緣的項目試試水,積累下經驗,今天對幾種常見的 Spring Boot Docker 打包工具進行了簡單總結。

Spring Boot Docker

在 Spring Boot 應用中,我們可以約定不同的標識來定義不同的環境。例如 dev 表示開發環境、test表示測試環境,對應的配置文件爲application-dev.yamlapplication-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>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:buildmvn dockerfile:tagmvn 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