首页 > 解决方案 > spring boot buildpack 总是从 git 下载最新的 packeto 镜像

问题描述

我使用 buildpack 使用以下命令从我的 Spring Boot 应用程序 2.5 版本创建了一个映像。

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=bootiful/demo

但是,每次我重建图像时,如果 packeto buildpack(在 git 中)发生变化,它会下载整个 packeto 构建器,占用我磁盘的不必要空间。我怎样才能通过仅指定特定标签来避免这种情况,这样git中packeto的每次更新都不会被拉到我的图像中......

标签: spring-bootpaketo

解决方案


但是,每次我重建图像时,如果 packeto buildpack(在 git 中)发生变化,它会下载整个 packeto 构建器,占用我磁盘的不必要空间。

这里有几点注意事项:

  1. 当 Docker 下载图像时,它很聪明。它只会下载已更改的图层。很难说每次下载会节省多少,但并非所有内容都会在构建器版本之间发生变化。

    构建器由构建映像和该构建器中构建包的层组成。例如,如果某些构建包在构建器版本之间没有更改,则不需要再次下载所有构建包。

    tl;博士 - 它可能没有你想象的那么糟糕。

  2. 每次都在获取新的构建器,因为理想情况下,您希望在构建新映像时拥有最新的软件。构建器包含构建时使用的库,以及构建包本身。

    例如,如果 Bellsoft Liberica buildpack 使用最新的 OpenJDK 版本进行了更新,您将需要下载最新的构建器,以便在下次编译应用程序和构建映像时获得该更新。

  3. 您可以docker system prune快速清理未使用的容器和图像。这将减少更新后的磁盘使用量。

我如何通过仅指定特定标签来避免这种情况,以便 git 中的 packeto 的每次更新都不会拉入我的图像中。

你有几个选择:

  1. 您可以设置拉取策略。它默认为“始终”。你会想要“如果不存在”。如果它们不存在,这将指示 Spring Boot 构建工具下载构建/运行图像。如果它们存在于本地,则不会再次下载它们。

    前任:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <pullPolicy>IF_NOT_PRESENT</pullPolicy>
                    </image>
                </configuration>
            </plugin>
    
  2. 您可以指定特定的构建器映像。它类似于#1,只需设置构建器图像和标签。

    前任:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder:0.1.115-base</builder>
                    </image>
                </configuration>
            </plugin>
    

有关这两个方面的参考,请参阅此处的设置:https ://docs.spring.io/spring-boot/docs/2.5.1/maven-plugin/reference/htmlsingle/#build-image

注意:您要小心使用这两个选项,因为它们可能会导致您使用较旧的构建器映像构建映像,从而使用较旧的构建包。它们不会自动更新。这可能会使您的图像基于较旧的库或较旧的依赖项(如 JVM 版本)构建。只是要记住的事情。


推荐阅读