使用 Jib 构建 Docker 镜像是否有助于优化远程 Docker 存储库存储?
我们在 Docker 中使用 Spring Boot 和 Gradle。目前,我们正在创建标准的胖 Boot jar,其中包含所有依赖项,然后我们用它创建一个图像,如下所示:
FROM gcr.io/distroless/java:11
COPY ./build/libs/*.jar app.jar
CMD ["app.jar"]
这导致我们每次构建时都会生成一个大 (250 MB) 的新映像,即使实际上更改的代码很少。这是因为 fat jar 包含共享依赖项(不经常更改)和我们的代码。这是我们私有存储库中存储空间的低效使用,我们想改变它。
为此,想法如下:
我们创建一个只包含 /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 并坚持认为它确实做到了这一点,但是在阅读了整个文档和常见问题解答并玩了一下之后,我不太确定。我们集成并使用./gradlew jibDockerBuild
它,它似乎确实为依赖项、资源和类创建了层,但仍然只有一个大图像。Jib 似乎专注于加快构建时间(通过利用 Docker 层缓存)和可重现的构建,但我认为当我们将该图像上传到我们的存储库时,相对于我们当前的解决方案没有任何改变 - 我们仍将存储“静态”依赖项多次,但现在我们将有多个图层,而不是每个新图像中只有一个。
有更多 Docker 和 Jib 经验的人能否解释一下 Jib 是否为我们提供了我们正在寻找的存储空间优化?
编辑:在等待答案时,我玩弄了所有这些并使用了https://github.com/wagoodman/dive,docker system df
并docker images
检查尺寸并查看图像和图层,似乎 Jib 确实做了什么我们需要。