# Упаковка
Упаковка приложений должна следовать стилю NPM:
npm pack
npm pack (opens new window) создаст TGZ с вашим приложением, который можно в дальнейшем использовать
где-либо еще. Однако приложения также могут быть опубликованы (opens new window) в репозитории NPM.
Важно заметить, что для работы с опубликованными/упакованными приложениями целевое окружение должно иметь доступ к
пакету @es4x/create (opens new window).
# Docker
Также вы можете создавать образы Docker.
es4x dockerfile
Вы получите простой dockerfile, который вы можете настроить на свой вкус, по умолчанию файл содержит три стадии
сборки.
nodeустановит все зависимостиNPMjavaустановит зависимостиMaven- Образ GraalVM запускает приложение
По умолчанию используется образ Docker oracle/graalvm-ce (opens new window), но вы можете заменить его на любой другой образ JDK (желательно версии 11 или выше) с поддержкой JVMCI.
docker build . --build-arg BASEIMAGE=openjdk:11
# JLink
Java 11 поддерживает jlink (opens new window). Вы можете использовать инструмент jlink для сборки и оптимизации набора модулей и их зависимостей в один образ среды выполнения.
es4x jlink
Данный образ будет оптимизированной средой выполнения, и может быть использован без необходимости полной установки JDK. Для сравнения, приложение hello world при запуске будет использовать 80Mb, тогда как полная установка JDK требует примерно 200Mb.
Эта возможность может использоваться в содействии с Dockerfile. Вместо использования базового образа graal,
используйте OpenJDK. Затем на второй стадии запустите jlink:
# Вторая стадия (собираем код, относящийся к JVM)
FROM openjdk:11 AS JVM
ARG ES4X_VERSION=${project.version}
# Копируем предыдущий шаг сборки
COPY /usr/src/app /usr/src/app
# Используем скопированное окружение
WORKDIR /usr/src/app
# Скачиваем инструмент ES4X
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
# Устанавливаем зависимости Java
# Заставляем разрешение es4x maven учитывать только зависимости production
RUN es4x install --only=prod
# Создаем оптимизированный образ среды выполнения
RUN es4x jlink -t /usr/local
Будет создан оптимизированная среда выполнения для jre, которую можно использовать с небольшим базовым образом для финальной стадии:
FROM debian:slim
# Собираем файлы jar с прошлого шага
COPY /usr/local /usr/local
COPY /usr/src/app /usr/src/app
# Используем скопированное окружение
WORKDIR /usr/src/app
# Группируем исходники приложения
COPY . .
# Задаем свои опции java для контейнеров
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+UseContainerSupport"
# Объявляем точку входа
ENTRYPOINT [ "./node_modules/.bin/es4x-launcher" ]
Будет создан небольшой итоговый образ, с большим слоем, так как оптимизированная среда выполнения будет тоже упакована.