# Package

Spakowane aplikacje powinny trzymać się konwencji NPM:

npm pack

npm pack (opens new window) wyprodukuje plik TGZ z aplikacją, który możesz przenosić do innych lokalizacji. Oprócz tego aplikacje mogą być również publikowane (opens new window) w rejestrach NPM.

Ważnym jest, by zauważyć, że aby opublikowane/spakowane aplikacje działały na docelowym środowisku musi mieć ono dostęp do paczki @es4x/create (opens new window), która jest wymagana do instalacji kawałków javy.

# Docker

Z aplikacji można tworzyć również obrazy dockerowe.

es4x dockerfile

Ta komenda wyprodukuje prosty dockerfile, który możesz konfigurować według własnych potrzeb. Domyślnie plik będzie 3 etapem builda.

  1. W pierwszym etapie używany jest node do instalacji wszystkich dependencji NPM.
  2. W drugim etapie używana jest java do instalacji dependencji Mavena.
  3. W końcowym etapie obraz GraalVM jest używany do uruchomienia programu.

Domyślnie używany jest obraz dockera oracle/graalvm-ce (opens new window). Można go jednak zastąpić każdym innym obrazem JDK (najlepiej wersji 11 lub wyższej), który wspiera JVMCI.

docker build . --build-arg BASEIMAGE=openjdk:11

Java 11 wspiera jlink (opens new window). Możesz użyć jlink do złożenia i optymalizacji modułów oraz ich dependencji w spersonalizowany obraz runtime.

es4x jlink

Komenda stworzy zoptymalizowany runtime, co znaczy że może on być użyty zamiast pełnej instalacji JDK. Dla porównania, program hello world stworzy plik ważący około 80Mb, podczas gdy pełna instalacja JDK wymaga około 200Mb.

Ta funkcjonalność może być użyta łącznie z Dockerfile. Zamiast używania podstawowego obrazu graal, użyj postawowego obrazu OpenJDK. Następnie w drugim etapie uruchom jlink:

# Etap drugi (tworzenie JVM związanego z kodem)
FROM openjdk:11 AS JVM
ARG ES4X_VERSION=${project.version}
# Skopiuj build z poprzedniego etapu
COPY --from=NPM /usr/src/app /usr/src/app
# Użyj skopiowanego workspace'u
WORKDIR /usr/src/app
# Pobierz ES4X runtime
RUN curl -sL https://github.com/reactiverse/es4x/releases/download/${ES4X_VERSION}/es4x-pm-${ES4X_VERSION}-bin.tar.gz | \
    tar zx --strip-components=1 -C /usr/local
# Zainstaluj dependencje Javy
# Wymuś rozwiązanie es4x maven tylko dla dependencji produkcyjnych
RUN es4x install --only=prod
# Stwórz zoptymalizowany runtime
RUN es4x jlink -t /usr/local

To stworzy zoptymalizowany runtime dla jre, który może zostać użyty z małym obrazem podstawowym dla ostatniego etapu:

FROM debian:slim
# Zbierz pliki jar z poprzedniego etapu
COPY --from=JVM /usr/local /usr/local
COPY --from=JVM /usr/src/app /usr/src/app
# Użyj skopiowanego workspace'u
WORKDIR /usr/src/app
# Bundle app source
COPY . .
# Zdefiniuj opcje javy dla kontenerów
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+UseContainerSupport"
# Zdefiniuj entrypoint
ENTRYPOINT [ "./node_modules/.bin/es4x-launcher" ]

Ten kod wyprodukuje mały obraz końcowy.