热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Docker决战到底使用多阶段构建SpringBoot应用镜像

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker决战到底使用多阶段构建SpringBoot应用镜像相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了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包慢许多。但是多阶段构建的好处还是不言而喻的。如果你有什么疑问或者文中有什么错误的地方,欢迎在留言区留言。


前文导航

Docker决战到底(一) 虚拟机中安装ubuntu系统

Docker决战到底(二) Docker环境搭建

Docker决战到底(三) Rancher2.x的安装与使用

Docker决战到底(四) Jenkins的安装与使用

Docker决战到底(五) 制作自己的Jenkins镜像

Docker决战到底(六) 制作自己的Maven镜像



Docker决战到底系列全为本人wendell_dev原创,转载请注明来源






作者:wendell_dev
链接:https://www.jianshu.com/p/efd934450686
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐阅读
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
author-avatar
手机用户2602913921
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有