前文导航
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包慢许多。但是多阶段构建的好处还是不言而喻的。如果你有什么疑问或者文中有什么错误的地方,欢迎在留言区留言。
前文导航
Docker决战到底(一) 虚拟机中安装ubuntu系统
Docker决战到底(二) Docker环境搭建
Docker决战到底(三) Rancher2.x的安装与使用
Docker决战到底(四) Jenkins的安装与使用
Docker决战到底(五) 制作自己的Jenkins镜像
Docker决战到底(六) 制作自己的Maven镜像
Docker决战到底系列全为本人wendell_dev原创,转载请注明来源。