为了解决上述问题,从17.05版本开始Docker在构建镜像时增加了新特性:多阶段构建(multi-stage builds),将构建过程分为多个阶段,每个阶段都可以指定一个基础镜像,这样在一个Dockerfile就能将多个镜像的特性同时用到,例如:先用maven镜像构建java工程,再把构建结果和jre合成,就做成了一个可以直接运行java工程镜像了;
官方描述如下图所示,地址是:https://docs.docker.com/develop/develop-images/multistage-build/
官方的实例是golang的,今天我们以maven构建springboot工程为例,实战如何使用multi-stage特性构建java微服务镜像;
环境信息
本次实战的环境信息如下:
-
操作系统:Ubuntu 18.04.2 LTS
-
Docker:18.06.1-ce
-
Java:1.8.0_191
-
Maven:3.6.1
实战源码
本次实战用到的源码是个普通springboot工程,功能是SpringCloud中的注册中心eureka,您可以在Github下载,地址和链接如下所示:
| 名称 | 链接 | 备注 |
| :-- | :-- | :-- |
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个文件夹,本章源码在springcloudscaledemo这个文件夹下,如下图红框所示:
springcloudscaledemo文件夹内有三个工程,本次实战用到的是eureka-server,如下图:
准备材料
在能正常运行docker的电脑上新建一个目录,例如我这里是ubuntu系统上/home/willzhao/temp/201906/02,将maven工程eureka-server复制到这个目录下;
避免每次构建镜像都下载工程所需的jar包
构建镜像过程中会用maven构建springboot工程,会下载springboot工程依赖的jar包,此过程很漫长,如果您多次构建Dockerfile镜像,那么每次都要经历这个过程,为了避免每次都下载,请做如下操作:
-
找一个可以运行maven的环境,把eureka-server工程复制到这个环境上;
-
在eureka-server目录下执行命令mvn clean package -U -DskipTests,开始构建此工程;
-
构建成功后,进入本地的maven缓存目录,通常是用户的home目录下的.m2文件夹