Docker决战到底(七) 使用多阶段构建Spring Boot应用镜像
前文导航
Docker决战到底(一) 虚拟机中安装ubuntu系统
Docker决战到底(二) Docker环境搭建
Docker决战到底(三) Rancher2.x的安装与使用
Docker决战到底(四) Jenkins的安装与使用
Docker决战到底(五) 制作自己的Jenkins镜像
Docker决战到底(六) 制作自己的Maven镜像
特别说明
Docker决战到底系列全为本人wendell_dev原创,转载请注明来源。在百度上搜索了一下关键词【docker决战到底】居然被其它非原创文章排在了我原创文章前面,虽然我记录的东西没多少人看,但是毕竟是花了我精力的,故作此特别说明。
一、前言概要
在前面几篇中我们利用了Dockerfile成功制作了自己的自定义镜像,本篇实战记录依然是编写Dockerfile来完成镜像的制作, 只不过我们将使用的是Docker17.05 之后的新特性 - 多阶段构建。
前面文章中我们演示制作的restful-api-demo应用镜像都是在jenkins上先利用maven命令编译打包好,再执行docker build命令,而本篇中我们将利用多阶段构建把编译过程写入Dockerifle中,这样一来,即使我们的jenkins没有集成maven,我们也能完成应用镜像的制作。这里为方便演示,依然使用的restful-api-demo作为示例项目,你可以把它Clone到你的本地,里面已经有制作好了的Dockerfile。 好了,话不多说,步入正题。
二、编写Dockerfile
在我们的Spring Boot应用根目录创建Dockerfile文件,并输入如下内容
# ===================================================================== # 使用多阶段构建镜像 # ===================================================================== FROM wendell023/maven:latest as builder ADD pom.xml pom.xml ADD src src RUN mv -f /usr/share/maven/ref/settings.xml /usr/share/maven/conf/settings.xml \ && mvn clean package -DskipTests=true FROM openjdk:8-jdk-alpine RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \ && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \ && apk add --no-cache tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone \ && apk del tzdata VOLUME /tmp COPY --from=builder target target ARG DEPENDENCY=target/dependency COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY ${DEPENDENCY}/META-INF /app/META-INF COPY ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-cp","app:app/lib/*","com.restful.api.demo.App"]
这里简单介绍一下我们的Dockerfile内容,第一个FROM来源于我们 前文 中制作好的maven镜像,并执行maven打包命令完成了我们对应用的编译打包,这一步完成之后就会生成target目录了。接下来第二个FROM就和常规的Spring Boot应用Dockerfile内容差不多了,主要注意一下 COPY --from=builder 这儿,这里相当于使用了前一个FROM的构建结果。
更多关于Docker的多阶段构建内容可查看官方文档: https://docs.docker.com/develop/develop-images/multistage-build/
三、构建镜像
当Dockerfile文件制作好后,接下来我们就开始准备构建镜像了。
访问 http://192.168.225.129:30010/ 进入我们的jenkins工作台
可以看到,这里的restful-api-demo-my-maven任务是我们前文Docker决战到底(六) 制作自己的Maven镜像中创建好的任务,restful-api-demo任务是我们前文 Docker决战到底(五) 制作自己的Jenkins镜像 中创建好的任务, 现在我们将重新配置一下restful-api-demo这个任务,在执行shell命令里面修改为如下内容:
docker build -t wendell/restful-api-demo:multistage -f Dockerfile-multistage .
保存配置后,我们在jenkins里执行构建任务,然后查看一下构建日志
从日志中可以看出,首先我们的第一个FROM打包应用成功了,而且maven仓库也来源于阿里云。 紧接着就是执行第二个FROM的内容,最终我们使用多阶段构建完成了Spring Boot应用镜像的制作。
接下来我们验证一下, 在宿主机执行如下命令查看镜像是否存在
$ docker image ls
四、使用小结
本篇实践记录主要演示了我们怎么完成Spring Boot应用中采用Docker多阶段构建的特性来编写Dockerfile,然后构建镜像,在多次的jenkins构建过程中,我发现第一个FROM每次都要重新从阿里云仓库下载jar包,这样下来,每次打包的速度就会比在宿主机volume持久化好jar包慢许多。但是多阶段构建的好处还是不言而喻的。如果你有什么疑问或者文中有 4000 什么错误的地方,欢迎在留言区留言。
前文导航
Docker决战到底(一) 虚拟机中安装ubuntu系统
Docker决战到底(二) Docker环境搭建
Docker决战到底(三) Rancher2.x的安装与使用
Docker决战到底(四) Jenkins的安装与使用
Docker决战到底(五) 制作自己的Jenkins镜像
Docker决战到底(六) 制作自己的Maven镜像
Docker决战到底系列全为本人wendell_dev原创,转载请注明来源。
- 第一个SpringBoot web 应用使用maven构建Docker镜像并容器化运行
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 使用maven集成docker构建和部署Spring Boot 应用
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
- 使用dockerfile 构建springboot 的docker镜像
- 用 Docker 构建、运行、发布一个 Spring Boot 应用
- 使用工具或者IDE迅速构建一个Spring Boot应用
- 使用idea14.1构建springboot应用时碰到的一些问题
- spring boot 入门-使用spring boot构建简单应用
- 使用Spring Boot快速构建基于SQLite数据源的应用
- 使用 Spring Boot 快速构建 Spring 框架应用
- 使用Spring Boot快速构建应用
- 使用Spring Boot快速构建应用
- 使用 Spring Boot 快速构建 Spring 框架应用
- 使用Dockerfile构建Springboot项目(视频)
- 手把手使用Docker搭建SpringBoot微服务镜像
- 使用 Spring Boot 快速构建 Spring 框架应用
- 使用 Spring Boot 快速构建 Spring 框架应用
- 使用Spring Boot快速构建应用