Spring Boot 2.3 Новые возможности Многоуровневый JAR

Java

Эта статья является оригинальной статьей. Любая форма перепечатки приветствуется, но обязательно с указанием источникаЛенг Ленг https://lltx.github.io.

задний план

В нашем реальном процессе контейнерного развертывания в рабочей среде мы часто сталкиваемся с ситуацией, когда образ Docker очень велик, а развертывание и выпуск происходят очень медленно.

На размер образа докера влияют три основных фактора:

    1. Размер базового изображения. Попробуйте выбрать alpine в качестве базового образа Уменьшите встроенный софт операционной системы
    1. Слои инструкций Dockerfile. Это требует от нас оптимизации Dockerfile, чтобы объединить как можно больше в одну строку и т. д.
    1. Размер банки приложения. Это ключевой контент, которым можно поделиться сегодня

картинка привет мир

Давайте начнем сspring boot 2.3.0Постройте простой веб-helloworld, затем постройте зеркало.

FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
ENTRYPOINT ["java", "-jar application.jar"]
docker build --build-arg JAR_FILE=./demo-layer-0.0.1-SNAPSHOT.jar  . -t demo:v1.0

Просмотр информации о слоях изображения

мы проходимdocker inspect demo:v1.0Давайте посмотрим на хэш-значение каждого слоя этого изображения.

// demo:v1.0 版本镜像分层信息摘要
"Layers": [
    "sha256:b7f7d2967507ba709dbd1dd0426a5b0cdbe1ff936c131f8958c8d0f910eea19e",
    "sha256:a6ebef4a95c345c844c2bf43ffda8e36dd6e053887dd6e283ad616dcc2376be6",
    "sha256:838a37a24627f72df512926fc846dd97c93781cf145690516e23335cc0c27794",
    "sha256:28ba7458d04b8551ff45d2e17dc2abb768bf6ed1a46bb262f26a24d21d8d7233",
    "sha256:55c91231ac46fdd63c3cf84b88b11f8a04c1870482dcff033029a601bc50e1ab",
    "sha256:9816c2d488754509f6024a267738b1e5fe33a7cd33bd25c5a9cdf6d4d7bfed1d",
    "sha256:f5fb3f91797d57a92f3f7e033398b8edd094df664db849a4950eabf2f5474535",
    "sha256:b87d2ff74819f83038ea2f89736a19cfcf99bfa080b8017d191c900a09a7524f"
]

привет мир обновление перестроить

МыhelloworldПрограмма частично модифицируется (имитация процесса разработки), а затем перестраивается образ

docker build --build-arg JAR_FILE=./demo-layer-0.0.1-SNAPSHOT.jar  . -t demo:v1.1

В настоящее время информация о наслоении изображения выглядит следующим образом.docker inspect demo:v1.1

// demo:v1.1 版本镜像分层信息摘要
"Layers": [
    "sha256:b7f7d2967507ba709dbd1dd0426a5b0cdbe1ff936c131f8958c8d0f910eea19e",
    "sha256:a6ebef4a95c345c844c2bf43ffda8e36dd6e053887dd6e283ad616dcc2376be6",
    "sha256:838a37a24627f72df512926fc846dd97c93781cf145690516e23335cc0c27794",
    "sha256:28ba7458d04b8551ff45d2e17dc2abb768bf6ed1a46bb262f26a24d21d8d7233",
    "sha256:55c91231ac46fdd63c3cf84b88b11f8a04c1870482dcff033029a601bc50e1ab",
    "sha256:9816c2d488754509f6024a267738b1e5fe33a7cd33bd25c5a9cdf6d4d7bfed1d",
    "sha256:f5fb3f91797d57a92f3f7e033398b8edd094df664db849a4950eabf2f5474535",
    "sha256:c1b6350d545fea605e0605c4bfd7f4529cfeee3f6759750d6a5ddeb9c882fc8f"
]

Сравните изображения v1.0, v1.1

Сравнив сводную информацию об изображении версии 1.0 и версии 1.1, мы обнаружим, что изменился только последний слой, мы передаемDive — инструмент анализа образов Docker, написанный на языке Go.чтобы определить, что делает последний слой

dive demo:v1.0,"Вы увидите, что окончательный файл jar отличается, а содержимое размером 16 М необходимо перестроить."

упаковка и расшифровка весенней загрузки по умолчанию

По умолчанию jar, созданный Spring Boot, может видеть следующую структуру каталогов после распаковки. По умолчанию он будет рассматриваться как единое целое, как отдельный слой при построении изображения,"Нет различий между бизнес-классами и указанными сторонними банками."

META-INF/
  MANIFEST.MF
org/
  springframework/
    boot/
      loader/
BOOT-INF/
  classes/
  lib/

layer jar

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

Включить многоуровневую упаковку

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
      <layers>
        <enabled>true</enabled>
      </layers>
    </configuration>
  </plugin>

Написание Dockerfile, который поддерживает многоуровневость

Ядро предоставляется через весеннюю загрузкуlayertoolsинструмент, разделите банку и загрузите ее отдельно с помощью команды COPY

FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

Создавайте новые изображения и просматривайте информацию о слоях

docker build --build-arg JAR_FILE=./demo-layer-0.0.1-SNAPSHOT.jar  . -t demo:v2.0
"Layers": [
    "sha256:b7f7d2967507ba709dbd1dd0426a5b0cdbe1ff936c131f8958c8d0f910eea19e",
    "sha256:a6ebef4a95c345c844c2bf43ffda8e36dd6e053887dd6e283ad616dcc2376be6",
    "sha256:838a37a24627f72df512926fc846dd97c93781cf145690516e23335cc0c27794",
    "sha256:28ba7458d04b8551ff45d2e17dc2abb768bf6ed1a46bb262f26a24d21d8d7233",
    "sha256:55c91231ac46fdd63c3cf84b88b11f8a04c1870482dcff033029a601bc50e1ab",
    "sha256:9816c2d488754509f6024a267738b1e5fe33a7cd33bd25c5a9cdf6d4d7bfed1d",
    "sha256:f5fb3f91797d57a92f3f7e033398b8edd094df664db849a4950eabf2f5474535",
    "sha256:06fe18cf8ae7384f120f2c6a3a33b31999dd0460cf1edae45e8f13adeab35942",
    "sha256:16cf814564b8a667fcc9f07314b6084cbef8dc8c0a6565c7a2d91d74faf7e7de",
    "sha256:94be40f716016b68cdd6b99d2cb8154acf8475c3a170a898a22f95a8ef40ffd3",
    "sha256:427d87d6a5fe6da13cb4233939c3a1ff920bc6b4d2f14b5d78af7aef98fda7de"
]

Измените кодовую часть бизнес-кода и перестройте его

docker build --build-arg JAR_FILE=./demo-layer-0.0.1-SNAPSHOT.jar  . -t demo:v2.1
"Layers": [
    "sha256:b7f7d2967507ba709dbd1dd0426a5b0cdbe1ff936c131f8958c8d0f910eea19e",
    "sha256:a6ebef4a95c345c844c2bf43ffda8e36dd6e053887dd6e283ad616dcc2376be6",
    "sha256:838a37a24627f72df512926fc846dd97c93781cf145690516e23335cc0c27794",
    "sha256:28ba7458d04b8551ff45d2e17dc2abb768bf6ed1a46bb262f26a24d21d8d7233",
    "sha256:55c91231ac46fdd63c3cf84b88b11f8a04c1870482dcff033029a601bc50e1ab",
    "sha256:9816c2d488754509f6024a267738b1e5fe33a7cd33bd25c5a9cdf6d4d7bfed1d",
    "sha256:f5fb3f91797d57a92f3f7e033398b8edd094df664db849a4950eabf2f5474535",
    "sha256:06fe18cf8ae7384f120f2c6a3a33b31999dd0460cf1edae45e8f13adeab35942",
    "sha256:16cf814564b8a667fcc9f07314b6084cbef8dc8c0a6565c7a2d91d74faf7e7de",
    "sha256:94be40f716016b68cdd6b99d2cb8154acf8475c3a170a898a22f95a8ef40ffd3",
    "sha256:8a20c60d361696a4e480fb6fbe1daf8b88bc54c579a98e209da1fb76e25de5aa"
]

Просмотр зеркала разностного слоя

Размер последнего изменения слоя составляет 5 КБ.

Суммировать

  • Изменение 16 МБ -> 5 КБ, эффект будет более очевидным в реальном процессе разработки.
  • Многоуровневая логика может быть указана с помощью плагина Spring Boot maven.Подробности см. в официальной документации.
  • Официальная документация:docs.spring.IO/весенняя загрузка…
image
image