Quarkus旨在实现“容器优先”的云原生开发框架,通过提供dockerfile和基础镜像简化容器镜像的构建。
Quarkus项目默认生成一个docker文件夹,里面包括四个dockerfile。
前两个使用jar包构建docker镜像,后两个使用本地可执行文件构建镜像。
前三个使用ubi-minimal作为基础镜像,最后一个使用quarkus-distroless-image作为基础镜像。
Dockerfile.jvm - 使用fast jar构建docker镜像,即复制target/quarkus-app下的文件用于启动项目;
Dockerfile.legacy-jar - 使用legacy jar构建docker镜像,即复制target下的lib目录和*-runner.jar文件用于启动项目;
Dockerfile.native - 使用本地可执行文件构建docker镜像,即复制target目录下的*-runner可执行文件用于启动项目;
Dockerfile.native-distroless - 同Dockerfile.native,仅基础镜像不同;

UBI是Universal Base Image的缩写,由Red Hat维护的基础镜像,它主要服务于Red Hat产品和技术;
Distroless代表仅包含应用和运行时依赖的基础镜像,它甚至没有包管理工具和shell,是体积更小的基础镜像;
构建Jar包的Docker镜像
执行命令:
docker build -f src/main/docker/Dockerfile.jvm -t geekstower/grocery-jvm .

该命令使用Quarkus脚手架生成的Dockerfile.jvm构建Docker镜像。
执行该命令的前提是已经生成fast jar,参考Quarkus系列-项目构建。
启动项目:
docker run -i --rm -p 8080:8080 geekstower/grocery-jvm
执行命令:
docker build -f src/main/docker/Dockerfile.native -t geekstower/grocery .

该命令使用Quarkus脚手架生成的Dockerfile.native构建Docker镜像。
执行该命令的前提是已经生成本地可执行文件,参考Quarkus系列-构建本地可执行文件。
启动项目:
docker run -i --rm -p 8080:8080 geekstower/grocery
使用Distroless构建本地可执行文件的Docker镜像
执行命令:
docker build -f src/main/docker/Dockerfile.native-distroless -t geekstower/grocery-distroless .

该命令使用Quarkus脚手架生成的Dockerfile.native-distroless构建Docker镜像。
同上,执行该命令的前提是已经生成本地可执行文件。
启动项目:
docker run -i --rm -p 8080:8080 geekstower/grocery-distroless
镜像分析
查看镜像:
docker images

可以看出:
1. 基于jar构建的镜像体积最大(380M),使用quarkus distroless基础镜像构建的可执行文件镜像最小(21.3M),使用UBI基础镜像构建的可执行文件镜像也不大(103M);
2. 使用distroless基础镜像构建的docker镜像的体积仅是使用UBI基础镜像构建的docker镜像的1/5;
3. 使用distroless基础镜像构建的docker镜像的体积仅是基于jar构建的docker镜像的1/18;
4. 使用distroless基础镜像构建的体积最小;




