Keresés tartalomra
Kategóriák
Címkék
- Java
- Spring
- Python
- IoC
- Android
- DI
- Dagger
- Thymeleaf
- Markdown
- JDK11
- AOP
- Aspect
- Captcha
- I18n
- JavaSpark
- Microframework
- Testing
- JUnit
- Security
- JWT
- REST
- Database
- JPA
- Gépház
- WebFlux
- ReactiveProgramming
- Microservices
- Continuous Integration
- CircleCI
- Deployment Pipeline
- Docker
- Mocking
- LogProcessing
- PlantUML
- UML
- Modellezés
- OAuth2
- Node.js
- DevOps
- Websocket
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 :))
Komment írásához jelentkezz be
Bejelentkezés
Még senki nem szólt hozzá ehhez a bejegyzéshez.