使用Jib构建Docker映像是否有助于优化远程Docker存储库存储?
我们在带有Gradle的Docker中使用Spring Boot。当前,我们正在创建带有所有依赖项的标准胖启动jar,然后使用它创建映像,如下所示:
FROM gcr.io/distroless/java:11
COPY ./build/libs/*.jar app.jar
CMD ["app.jar"]
即使实际上只更改了很少的代码,每次构建时也会产生较大的(250 MB)新映像。这是因为胖子罐包含共享的依赖项(不经常更改)和我们的代码。这是私有存储库中存储空间的低效使用,我们希望对此进行更改。
为此,想法如下:
-
我们创建一个基本映像,该映像仅包含/ opt / libs中的依赖项,我们将其称为
spring-base:1.0.0
并推送到我们的私有Docker注册表。 -
我们使用该图像作为仅包含我们代码的应用程序图像的父级/基础。 Dockerfile看起来与此类似(未经演示,仅用于介绍概念):
FROM our-registry/spring-base:1.0.0 COPY ./build/classes/kotlin/main/* /opt/classes COPY ./build/resources/main/* /opt/resources ENTRYPOINT ["java","-cp","/opt/libs/*:/opt/resources:/opt/classes","com.example.MainKt"]
期望这些图像要小得多,并且具有依赖性的大型基础图像仅存储一次,从而节省了大量存储空间。
我们的一位同事调查了Jib并坚持要做到这一点,但是在阅读了整个文档和FAQ并进行了一些尝试之后,我不确定。我们将其集成并使用./gradlew jibDockerBuild
,它似乎确实为依赖项,资源和类创建了层,但是仍然只有一个大的形象。 Jib似乎专注于加快构建时间(通过利用Docker层缓存)和可复制的构建,但是我认为,当我们将该映像上传到我们的存储库时,相对于我们当前的解决方案不会有任何变化-我们仍将存储“静态”依赖项多次,但是现在我们将具有多层,而不是每个新图像中只有一层。
任何具有Docker和Jib经验的人都可以解释Jib是否为我们提供了我们正在寻找的存储空间优化?
编辑:在我等待答案时,我尝试了所有这些操作,并使用https://github.com/wagoodman/dive,docker system df
和docker images
检查大小和查看图像和图层,看来Jib确实满足了我们的需要。