Itt jársz most: Kezdőlap > Alkalmazásfejlesztés > Egyperces: A Spring Boot és az Alpine nem barátok

Szűrő megjelenítése

Egyperces: A Spring Boot és az Alpine nem barátok

Kezdjük az elején, hogy pontosan mi is történt. A Leaflet és a mellette futó segéd-servicek mind Java 17-en, Spring Boot 3.1 alatt futottak néhány héttel ezelőttig. A jelenlegi LTS Java verzió a 21-es, a Spring Boot 3.1.x támogatása pedig május végén megszűnt (a Boot minor verziókra mindössze egy év támogatási időszak van, illetve féléves release cycle-ökkel jelennek meg, ezzel érdemes tisztában lenni), jelenleg a 3.3.x branch az aktuális minor verzió. Ezek miatt döntöttem a frissítésnél, ami többé-kevésbé meglepően simán ment -- a probléma az alkalmazás Docker imagebe csomagolásánál jelentkezett és igazából itt sem maga a frissítés okozta.

Mivel jelenleg a Java karban- és életben tartása az Eclipse Foundation feladata (a neve most épp Eclipse Temurin by Adoptium, ha valaki még tudja követni, dobjon egy üzenetet a magyarázattal, please), az Eclipse Temurin JRE Docker alap imageket használom az alkalmazásaim futtatására. Észrevettem azonban, hogy már elérhető Alpine alapú image is: aki még nem találkozott volna Alpine imagekkel, egyike a sok Linux disztribúciónak, azonban nagyon népszerű választás Docker csomagoláshoz, mivel egy szignifikánsan és szándékosan lebutított, leegyszerűsített Linux változatról van szó. Az image nagyon kicsi, a containerizált OS memóriaigénye közel 0, de ugyanúgy bármilyen runtime futtatására be lehet állítani. Úgy döntöttem a "sima" Ubuntu alapú image helyett érdemes volna erre váltani, azonban csomagolás után az alkalmazás nem indult el, a container logjában pedig csak az alábbi hibaüzenetet láttam:

...
/bin/bash: leaflet-backend-exec.jar: not found
...

A teljesen kriptikus hibaüzenet nem sokat segített, mert ugye most akkor igazából mi nem található? A bash vagy a leaflet-backend-exec.jar? Megvizsgálva az image tartalmát a jar file a helyén volt, belépési pont megváltoztatással elindítva pedig a Java runtime elérhető volt és működött, de az alkalmazást nem tudtam elindítani. Gyanússá vált azonban a bash, mivel az többnyire egy kiegészítő alkalmazás a Linux disztrókban, a hivatalos és alapértelmezett shell interpreter az sh. Az Alpine pedig mindent, ami nem hivatalos, mellőz, és bizony jó volt a megérzésem, bash nem volt található a rendszeren. De akkor miért akarta azzal indítani a jar filet (szemfülesebbeknek talán az is feltűnhetett, hogy egyáltalán miért nem java -jar ... a command line). Nos a válasz és a megoldás egészen prózai.

Aki dolgozott már Spring Boottal, minden bizonnyal találkozott már az egyik kényelmi funkciójával, ami a jar file-ok futtathatóvá csomagolását illeti. A Boot Maven pluginja ugyanis képes a Maven Assembly pluginhoz hasonlóan a függésekkel összecsomagolt jar filet készíteni, illetve azzal kiegészíteni a dolgot, hogy nem szükséges a java processen keresztül indítani a csomagot, hanem mint egy standard Linux binárist, elindíthatjuk önállóan is. Ez utóbbinak nagy előnye, hogy a Java processnek szánt kapcsolókat (például max heap méret, GC tuning kapcsolók, stb.) a parancssor helyett elhelyezhetjük egy külön .conf fileban, aminek a tartalma az alkalmazás indításakor fel lesz használva. A beállítás csupán néhány sor a Maven POM-ban:

<configuration>
    <!-- csomagolás önállóan indítható csomaggá -->
    <executable>true</executable>
</configuration>
<executions>
    <!-- függések becsomagolása -->
    <execution>
        <id>repackage</id>
        <configuration>
            <classifier>exec</classifier>
        </configuration>
    </execution>
    <!-- ... -->
</executions>

A problémát itt most az executable kapcsoló okozza, illetve az, amit a jar csomaggal tesz annak érdekében, hogy az önállóan tudjon futni. Az történik ugyanis, hogy a jar csomag elejére elhelyez egy shell scriptet, ami többek között megkeresi és felolvassa a már említett .conf file tartalmát, megkeresi a Java runtime-ot a rendszeren, összerakja a parancssort, majd elindítja a jar csomagot, lényegében ugyanúgy egy java -jar ... hívással. A script egy teljesen átlagos kinézetű shell script, a kötelező jellegű shebang sorral kezdve, ami ez esetben nem más mint:

#!/bin/bash
...

Mindezzel nem is lenne baj, ha lenne bash az Alpine imagekben. Több megoldás is létezik persze, vagy elengedjük az önálló executable csomagolást és kézzel indítjuk java -jar ... paranccsal az alkalmazást vagy nem használjuk az Alpine imaget, amíg nem készül hozzá hivatalos Boot támogatás.

(PS.: Én lusta voltam és maradtam az Ubuntu image-nél :))

Kommentek

Komment írásához jelentkezz be
Bejelentkezés

Még senki nem szólt hozzá ehhez a bejegyzéshez.