digital-garden/dev/java/quarkus/Сборка Quarkus приложения в исполняемый файл.md
Struchkov Mark d8605648be
All checks were successful
continuous-integration/drone/push Build is passing
Сборка Quarkus приложения в исполняемый файл.md
2024-09-08 12:13:12 +03:00

60 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
tags:
- maturity/🌱
date:
- - 2024-04-07
zero-link:
- "[[../../../meta/zero/00 Quarkus|00 Quarkus]]"
parents:
- "[[../Нативные сборки в Java|Нативные сборки в Java]]"
linked:
---
Провозился два дня, но в итоге смог собрать один из микро-сервисов в нативном режиме. Ничего сложного, но было много нюансов в настройке CICD.
Самое полезное, это вот [эта документация Quarkus](https://quarkus.io/guides/building-native-image). А конкретно флаги:
- `-Dquarkus.native.container-build=true`
- `-Dquarkus.native.remote-container-build=true`
Эти флаги необходимо добавить в команду сборки
```shell
gradle build -Dquarkus.package.type=native -Dquarkus.native.remote-container-build=true
```
```shell
./mvnw package -Dnative -Dquarkus.native.remote-container-build=true
```
Во время сборки будет скачан докер образ с GraalVM и сборка будет проходить уже в этом образе. То есть можно использовать любой раннер CI без предварительной настройки базового образа.
А вот так выглядит [Dockerfile](../../../../../_inbox/Dockerfile.md) сервиса:
```Dockerfile
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6
WORKDIR /work/
RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
COPY ./build/*-runner /work/application
EXPOSE 8080
USER 1001
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
```
Сервис стал собираться в 2,5 раза больше, около 5 минут, вместо 2. Но теперь он стартует моментально, наверное за доли секунды. При этом на под выделяется всего 256 mb ОЗУ на старте и 512 mb в момент работы.
## Более сложный путь
Также слепил образ для GitLab-раннера, который совмещает GraalVM и Docker, осталось добавить в него Gradle, но пока использую `./gradlew`. Оставлю это тут на всякий случай.
```Dockerfile
FROM ghcr.io/graalvm/graalvm-ce:ol9-java17-22.3.0
WORKDIR /opt/graalvm
RUN gu install native-image
RUN microdnf -y install dnf-plugins-core
RUN microdnf -y install yum
RUN yum install -y yum-utils
RUN yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
RUN yum install -y docker-ce docker-ce-cli containerd.io
```