第 12 章 生成原生可执行文件
您可以使用 Podman 或 Docker 等容器运行时从 Quarkus 应用程序生成原生可执行文件。Quarkus 使用构建器镜像生成二进制可执行文件,您可以和 Red Hat Universal Base Images RHEL8-UBI 和 RHEL8-UBI 最小一起使用。Red Hat build of Quarkus 1.11 使用 registry.access.redhat.com/quarkus/mandrel-20-rhel8:20.3 作为 quarkus.native.builder-image 属性的默认值。
应用程序的原生可执行文件包含应用程序代码、所需的库、Java API 和虚拟机(VM)的减少版本。较小的虚拟机基础改进了应用程序的启动时间,并生成最小的磁盘占用。
流程
打开 Getting Started 项目
pom.xml文件,并验证该文件是否包含native配置集:<profiles> <profile> <id>native</id> <properties> <quarkus.package.type>native</quarkus.package.type> </properties> </profile> </profiles>注意使用 Quarkus
native配置集允许您运行原生可执行文件和原生镜像测试。使用以下方法之一构建原生可执行文件:
使用 Docker 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true
使用 Podman 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
这些命令在
目标目录中创建get-started the guestfish-runner二进制文件。重要在分析和优化过程中,将 Quarkus 应用程序编译到原生可执行文件中会消耗大量内存。您可以通过设置
quarkus.native.native-image-xmx配置属性来限制原生编译过程中使用的内存量。设置低内存限值可能会增加构建时间。如需了解更多详细信息,请参阅 原生可执行配置属性。
运行原生可执行文件:
./target/getting-started-*-runner
构建原生可执行文件时,启用了
prod配置集,并使用prod配置集运行 Quarkus 原生测试。您可以使用quarkus.test.native-image-profile属性进行修改。
12.1. 手动创建容器
本节介绍如何使用应用程序为 Linux X86_64 手动创建容器镜像。当您使用 Quarkus 原生容器生成原生镜像时,它会创建一个以 Linux X86_64 操作系统为目标的可执行文件。如果您的主机操作系统与此不同,您将无法直接运行二进制文件,您需要手动创建容器。
您的 Quarkus 入门项目在 src/main/docker 目录中包含一个 Dockerfile.native,其内容如下:
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3
WORKDIR /work/
RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application
EXPOSE 8080
USER 1001
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Dockerfile 使用 UBI 作为基础镜像。此基础镜像设计为在容器中工作。Dockerfile 使用 基础镜像的最小版本 来缩小生成的镜像的大小。
流程
使用以下方法之一构建原生 Linux 可执行文件:
使用 Docker 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true
使用 Podman 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
使用以下方法之一构建容器镜像:
使用 Docker 构建容器镜像:
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
使用 Podman 构建容器镜像
podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
运行容器:
使用 Docker 运行容器:
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
使用 Podman 运行容器:
podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-started