知识卡片
多阶段构建剔除中间产物
内容
要把 fat-JAR 拆成分层再塞进镜像,中间必然要经过”先把 JAR 解压出来”这一步,但解压前的原始 JAR 文件不该留在最终镜像里,否则分层优化的效果就被这份多余的原始文件抵消了。Docker 的多阶段构建解决了这个矛盾:第一阶段用一个临时的构建环境完成解压这类脏活,第二阶段从头开始只挑第一阶段产出的目标文件拷过来,第一阶段包括原始 JAR 在内的所有中间产物全部丢弃,不会出现在最终镜像的任何一层里。发散:这是”构建环境”和”运行环境”分离的具体体现——构建过程需要的工具和中间文件(编译器、解压临时文件)不应该跟着最终产物一起发布出去,多阶段构建把这条界线在同一个 Dockerfile 里明确地画了出来,最终镜像因此更小、攻击面也更小(不会带着一堆构建期才用得上的工具)。
参考来源
《Cloud Native Spring in Action》第6章《Containerizing Spring Boot》