пакет сборки spring boot всегда загружает последние изображения packeto из git

#spring-boot #paketo

Вопрос:

Я создал образ из своего загрузочного приложения spring версии 2.5 с помощью пакета buildpack, используя команду ниже .

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

однако каждый раз, когда я перестраиваю образ, если в пакете packeto buildpack (в git) происходят изменения, он загружает весь конструктор packeto, занимая ненужное место на моем диске. как я могу избежать этого, указав только определенный тег, чтобы каждое обновление packeto в git не отображалось на моем изображении….

Ответ №1:

однако каждый раз, когда я перестраиваю образ, если в пакете сборки packeto (в git) происходят изменения, он загружает весь конструктор packeto, занимая ненужное место на моем диске.

Несколько заметок здесь:

  1. Когда Docker загружает изображение, он делает это разумно. Он будет загружать только те слои, которые изменились. Трудно сказать, сколько это сэкономит при каждой загрузке, но не все изменится между версиями builder.

    Конструктор состоит из образа сборки и слоев для пакетов сборки в этом конструкторе. Если, например, некоторые пакеты сборки не меняются между версиями конструктора, то не нужно будет загружать их все снова.

    tl;dr — это может быть не так плохо, как вы думаете.

  2. Он каждый раз выбирает новый конструктор, потому что в идеале вы хотите иметь самое свежее программное обеспечение при создании новых изображений. Конструктор содержит библиотеки, которые используются во время сборки, и сами пакеты сборки.

    Если, например, пакет сборки Bellsoft Liberica обновлен до последней версии OpenJDK, вам потребуется загрузить последнюю версию конструктора, чтобы получить это обновление при следующей компиляции вашего приложения и создании образа.

  3. Вы можете docker system prune быстро очистить неиспользуемые контейнеры и изображения. Это сократит использование диска после извлечения обновлений.

как я могу избежать этого, указав только определенный тег, чтобы каждое обновление packeto в git не отображалось на моем изображении.

У вас есть пара вариантов здесь:

  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. Просто нужно кое-что иметь в виду.