您的位置:首页 > 运维架构 > Docker

Docker决战到底(七) 使用多阶段构建Spring Boot应用镜像

2019-03-21 12:36 721 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wendell_dev/article/details/88712038

前文导航
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原创,转载请注明来源。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: