Евген Дегтяренко

30 юни 2019 г. · 4 минути четене

Наскоро имах задача да докеризирам и стартирам в простото приложение за пролетно зареждане 2 k8s. Това не е нещо ново и можете да намерите много примери в google как да направите това. Бях изненадан, че не намерих модерно алпийско изображение jdk11 в хранилището на openjdk. Очаквах тънкият да е достатъчно малък, но се оказа 422 mb. Тази публикация ще сподели моя опит за намаляване на размера на изображението за пролетно зареждане 2, работещо на java 11 до 144 mb.

размера

Приложение

Както споменах e arlier, използвам spring boot 2, който е REST API над релационна база данни (използвайки @RepositoryRestResource).
Имам следните зависимости:

Размерът на буркана е 37,6 mb.

След изграждането на докер получавам изображение от 422 mb според изображенията на докер изход. Доста интересно е, че използването на 8-jdk-тънък резултат в 306 mb изображение.

Опит 1: други изображения

Първата логична стъпка в намаляването би била намирането на алтернативно изображение (за предпочитане на базата на алпийски).

Проверих следните хранилища с java

(11 като текуща версия на LTS и 8, тъй като все още има достатъчно наследено приложение, което не може да бъде актуализирано)

Тук можете да намерите таблицата с изображения, етикети и техните размери (в момента на писане на статията).

Това е кратка извадка:

Според тези резултати бихме могли да преминем към Adoptopenjdk/openjdk11: alpine-jre. Това ще доведе до само 177mb изображение.

Опит 2: потребителско изпълнение

Тъй като jdk9 и функцията за модулиране, можем да се опитаме да изградим собствено време за изпълнение само с необходимите модули за приложение.
Тази функция е документирана тук.

Нека се опитаме да открием необходимите модули за приложението spring boot 2:

Добре, изглежда, че jdeps не може да се справи с дебелия буркан, нека го разопаковаме и посочим classpath:

Опитах jdk12 да получа тази информация, но се сблъсках с още един проблем:

Използвайки модул за проба, грешка и намиране от ClassNotFoundException, открих, че за стартиране са необходими следните модули:

  • java.base
  • java.logging
  • java.sql
  • java.именуване
  • java.управление
  • java.instrument
  • java.desktop
  • java.security.jgss

За да създадете изпълнение по избор на изпълнение:

Нека опаковаме това в Dockerfile:

Изображението на докера за резултати (без приложение) е само 106 mb, което е тихо и малко в сравнение с други налични опции. След като го използвате с приложение, той нараства до 144 mb.

Можем да го маркираме като `spring-boot-runtime: openjdk-11-slim` и да го използваме като образ на базовия докер за всички приложения за пролетно зареждане, в случай че всички те имат подобни зависимости. Ако това не е вярно, бихме могли да докеризираме всяко приложение, използвайки многоетапно изграждане (стъпка 1: персонализирано изпълнение, стъпка 2: добавяне на jar).

Заключение

В момента повечето изображения по подразбиране на java docker имат тих размер.
Това може лесно да бъде променено чрез използване на тагове само с jre или чрез изграждане на изображения с персонализирани изпълнения на Java.