不要把大型JAR包放进Docker镜像-InfoQ
jwenjian opened this issue · 0 comments
jwenjian commented
InfoQ的一篇文章,谈为什么不要把大型JAR包放进Docker镜像,以及应该如何正确的构建基于java的docker镜像。
原则就是利用docker镜像的分层机制,每次分发时只更新程序的变更, 而不是将整个JRE都全部更新一遍。
Docker 镜像的分层机制非常强大。如果你所有的应用程序都使用了相同的基础镜像(比如 openjdk:11.0.4-jre-slim),Docker 重用了 OS 和 JRE 的一些层,这样就可以节省 Docker 注册表的存储空间,上传和下载镜像的速度也更快了,因为只需要传输更少的文件量(Docker 只会将新的层传输到注册表中)。
一个java程序,主要是由依赖项, 资源文件, 代码组成,这三项的占用空间的比例如下:
没有必要每次代码的提交都把所有的依赖项,资源文件, 代码全部打包成一个新的docker镜像。
最好的实现是合理的对镜像进行分层:
最后提到了google的Jib插件,它会为你处理好镜像分层的工作。
实际上,我们不需要手动编写 Dockerfile,我们可以使用谷歌的 Jib 插件。Jib 是一个 Maven 或 Gradle 插件,用于简化 Java 应用程序镜像的打包过程。对于我们来说,Jib 最重要的一个特性是,它会扫描我们的 Java 项目,并为依赖项、资源文件和代码创建不同的层。