idea docker 镜像生成太慢太大问题

文章目录

  • 前言
  • 一、更小的jdk基础镜像
  • 二、服务瘦包(thin jar)
    • 2.1 maven
    • 2.2 修改dockerfile
    • 2.3 container run options
  • 三、 基础jdk镜像入手?
  • 总结


前言

idea docker 内网应用实践遗留问题

  1. idea docker插件 build 服务镜像太慢
  2. 服务镜像太大

一、更小的jdk基础镜像

精简的jdk镜像 123MB,jdk17-alpine

二、服务瘦包(thin jar)

打包成瘦包(thin jar)在许多情况下都有明显的优势,尤其是在企业级和分布式部署环境中。以下是瘦包的一些主要好处:

  • 减小文件尺寸: 瘦包仅包含应用本身的代码和必需的资源,不包含外部依赖。这通常会导致文件尺寸比包含所有依赖的胖包(fat jar)小得多,这使得上传到服务器或存储在仓库中更快速、更高效。

  • 快速构建: 在构建过程中,由于不需要打包所有的依赖,构建瘦包通常比构建胖包要快。

  • 部署灵活性: 瘦包允许在部署时选择性地添加依赖。你可以根据不同的环境(开发、测试、生产)来管理依赖,这意味着可以有针对性地解决依赖性问题。

  • 共享依赖: 如果多个应用部署在同一服务器上,它们可以共享相同的依赖库,减少重复的依赖文件,节省空间。

  • 依赖管理: 瘦包使得依赖管理更加明确。所有的外部依赖都在构建或部署过程中被解决,这样可以更容易地处理依赖之间的冲突。

  • 更新和维护: 如果需要更新或替换某个依赖,你可以单独更新那个依赖,而不需要重新构建整个应用的胖包。

  • 资源占用: 对于基于微服务的架构,使用瘦包可以在微服务之间共享公共的运行时环境,减少了每个服务实例的资源占用。

  • 安全性: 在有严格安全要求的环境中,使用瘦包可以更容易地进行安全审计,因为你可以精确地知道哪些库是运行时必需的。

  • 与容器技术协同: 在使用容器技术(如 Docker)时,瘦包可以轻松结合基础镜像中的依赖,便于创建轻量级的容器镜像。

然而,瘦包也有它的缺点,例如可能需要额外的依赖管理工具或处理依赖传递的复杂性,因此在决定使用瘦包时,需要根据项目的具体需求和部署环境来权衡利弊。

2.1 maven

plugins 添加maven打包策略

            <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.12.RELEASE</version><configuration><mainClass>com.cuzue.file.FileServerApplication</mainClass><layout>ZIP</layout><!-- 打增量包时需要includes部分, 要打全量包删除includes --><includes><include><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>../lib</outputDirectory><excludeTransitive>false</excludeTransitive><stripVersion>false</stripVersion><!--complie和runtime的包都打到lib中,否则可能lib缺包--><includeScope>runtime</includeScope></configuration></execution></executions></plugin>

2.2 修改dockerfile

主要修改:

  • 外部lib 容器卷挂载
  • JVM使用/dev/urandom作为熵源来加快随机数的生成速度-Djava.security.egd=file:/dev/./urandom
FROM jdk-alpine:17
LABEL maintainer="cuzue 991446772@qq.com"
VOLUME ["/tmp","/mnt/upload","/server/lib"]
ADD target/*.jar file.jar
ENV SERVER_PORT="8000" XMS="1024m" XMX="1024m" NACOS_CONFIG_ADDR="nacos.server:8848" NACOS_CONFIG_SPA="intelligence-gsdss" NACOS_DISCOVERY_ADDR="nacos.server:8848" NACOS_DISCOVERY_SPA="intelligence-gsdss" MAIN_CLASS="com.cuzue.file.FileServerApplication"
ENTRYPOINT java -server -Xms$XMS -Xmx$XMX -Dserver.port=$SERVER_PORT -Dloader.path=/server/lib/ -Djava.security.egd=file:/dev/./urandom -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=dev -Dspring.cloud.nacos.config.server-addr=$NACOS_CONFIG_ADDR -Dspring.cloud.nacos.config.namespace=$NACOS_CONFIG_SPA -Dspring.cloud.nacos.discovery.server-addr=$NACOS_DISCOVERY_ADDR -Dspring.cloud.nacos.discovery.namespace=$NACOS_DISCOVERY_SPA -jar file.jar $MAIN_CLASS

2.3 container run options

  • 上传服务package生成的lib包到宿主机/data/server/app/lib
  • docker容器启动指定容器卷-v /data/server/app/lib:/server/lib
    容器卷指定路径,宿主机/data/server/app/lib容器路径/server/lib

在这里插入图片描述

三、 基础jdk镜像入手?

下一步思路多阶段构建或更好的方案,没有具体实践,不知道怎么弄,有经验的小伙伴希望可以分享一下可行性高的方案

打包镜像时不将jdk基础镜像打包到每一个服务中,类似挂载jdk容器卷可以实现,但是这种方式并不是Docker的最佳实践,且可能会导致预期之外的问题,特别是在使用不同版本的JDK或涉及到JDK内部路径变动时。

GPT的建议:
在Docker中,如果你想要避免将JDK基础镜像打包到每一个服务的镜像中,可以采用以下几种常见的方法:

  1. 使用多阶段构建(Multi-stage build):
    多阶段构建允许你在一个Dockerfile中使用多个FROM语句。你可以在一个阶段使用包含JDK的基础镜像来编译和构建应用,然后在第二个阶段只将编译后的应用复制到一个不含JDK的轻量级基础镜像中。例如:

    # 第一阶段:构建
    FROM maven:3.6.3-jdk-11 AS builder
    WORKDIR /app
    COPY src /app/src
    COPY pom.xml /app
    RUN mvn clean package# 第二阶段:创建最终镜像
    FROM openjdk:11-jre-slim
    COPY --from=builder /app/target/my-app.jar /app/
    CMD ["java", "-jar", "/app/my-app.jar"]
    

    这样做的好处是你的最终镜像大小减小,因为它不包含整个JDK,只有JRE。

  2. 使用JRE基础镜像:
    如果你的应用不需要JDK中的编译工具,而只需要运行Java字节码,你可以直接使用JRE基础镜像而不是JDK。这可以减少镜像大小并缩短下载时间。

  3. 创建自定义基础镜像:
    你可以创建一个自定义的基础镜像,其中包含了JDK和你的应用通用的其他依赖。然后,你可以在构建每个服务的Docker镜像时使用这个自定义镜像作为基础。

  4. JDK资源共享:
    如果你的多个服务部署在同一台机器上,可以考虑在Docker主机上安装JDK,并通过卷(volume)共享的方式让不同的容器使用同一个JDK。

  5. 使用精简版JDK发行版:
    对于需要JDK环境的服务,可以考虑使用精简版的JDK发行版,如AdoptOpenJDK的OpenJ9、Alibaba的Dragonwell或者Amazon的Corretto等。这些发行版往往提供了更小的容器镜像。

请注意,选择哪种方法取决于你的具体需求和约束。多阶段构建是最常见的做法,因为它提供了灵活性和优化的最终镜像大小。不过,如果你的服务确实需要JDK来运行,例如它们使用JDK特定的工具或API,那么这种情况下你可能无法避免在每个服务镜像中包含JDK。

总结

GPT的建议:
如果你在使用 IntelliJ IDEA 配合 Docker 进行镜像构建时遇到速度慢的问题,可以尝试以下几种方法来改善这个情况:

  1. 优化 Dockerfile:
  • 减少镜像层数:每条 RUNCOPYADD 指令都会创建一个新的镜像层。通过组合指令来减少层数可以减少构建时间。
  • 使用 .dockerignore 文件:排除不必要的文件和目录被复制到 Docker 上下文中,减少构建时间和镜像大小。
  • 利用构建缓存:确保更改频繁的指令放在 Dockerfile 的底部,这样可以最大化地利用 Docker 缓存。
  1. 提升硬件性能:
  • Docker 镜像构建过程中可能会占用大量的 CPU 和内存资源,确保你的开发机器有足够的资源分配给 Docker。
  • 如果使用的是虚拟机或远程 Docker 守护进程,提高网络速度和分配给虚拟机的资源可能有帮助。
  1. 使用更快的网络连接:
  • 镜像构建过程中可能需要下载基础镜像和依赖,网络速度的快慢直接影响到下载速度。
  1. 设置 Docker 镜像加速器:
  • 很多地区通过 Docker 官方镜像源下载镜像可能会比较慢,使用国内的镜像加速服务可以显著提高下载速度。
  1. 减少构建上下文大小:
  • Docker 在构建镜像时,会将当前目录(即构建上下文)发送到 Docker daemon,如果当前目录很大,会导致构建过程缓慢。减少构建上下文的大小可以提高速度。
  1. 分阶段构建(Multi-stage builds):
  • 如果你的应用构建过程包括编译等多个步骤,可以使用分阶段构建来减少最终镜像的大小,从而减少上传到仓库的时间。
  1. 预先拉取基础镜像:
  • 如果构建过程需要使用到某些特定的基础镜像,提前手动拉取这些镜像可以省去构建过程中的下载时间。
  1. 关闭 IDE 的不必要插件或服务:
  • IntelliJ IDEA 中运行的其他后台任务可能会影响到 Docker 镜像构建的性能,尝试关闭不需要的插件或服务。
  1. 定期清理 Docker:
  • 定期使用 docker system prune 清理无用的 Docker 对象(例如悬空的镜像和停止的容器),可以释放磁盘空间,有时也能提高构建速度。

检查这些方面,并根据你的具体情况进行调整,应该能够帮助你提高在 IntelliJ IDEA 中使用 Docker 打包镜像的速度。如果这些方法都不奏效,可能需要更详细地分析构建过程中的瓶颈。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00223】基于Springboot+vue的图书购物商城(论文)

基于Springbootvue的图书购物商城&#xff08;论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springbootvue的前后端分离的图书商城购物系统 本系统分为用户以及管理员2个角色。 用户&#xff1a;用户登录后、可以查看新上架的书籍和新闻等…

npm ERR! reason: certificate has expired(淘宝镜像过期)

npm ERR! request to https://registry.npm.taobao.org/yauzl/-/yauzl-2.4.1.tgz failed, reason: certificate has expired 今天在执行npm install命令时&#xff0c;报错百度了下是淘宝证书过期原因 解决方法一 执行下面两个命令再进行npm install即可 npm cache clean --…

【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归&#xff08;含代码&#xff09;&#xff0c;熟练掌握numpy,pandas,sklearn等框架使用。在算法上&#xff0c;掌握神经网络的数学原理&#xff0c;手动实…

02链表:19、删除链表的倒数第N个节点

19、删除链表的倒数第N个节点 文章目录 19、删除链表的倒数第N个节点方法一&#xff1a;快慢指针 思路&#xff1a;使用虚拟头节点快慢指针&#xff0c;fast指针先走n1&#xff0c;直到为null&#xff0c;slow节点刚好在删除元素前一个位置&#xff0c;方便操作 重点&#xff1…

2024美赛数学建模B题思路源码

赛题目的 赛题目的&#xff1a; 问题描述&#xff1a; 解题的关键&#xff1a; 问题一. 问题分析 问题解答 问题二. 问题分析 问题解答 问题三. 问题分析 问题解答 问题四. 问题分析 问题解答 问题五. 问题分析 问题解答

云计算基础(云计算概述)

目录 一、云计算概述 1.1 云计算的概念 1.1.1 云计算解决的问题 1.1.2 云计算的概念 1.1.3 云计算的组成 1.2 云计算主要特征 1.2.1 按需自助服务 1.2.2 泛在接入 1.2.3 资源池化 1.2.4 快速伸缩性 1.2.5 服务可度量 1.3 云计算服务模式 1.3.1 软件即服务(Softwar…

老师罚学生钱违法吗

在教师岗位上耕耘了近十年&#xff0c;我遇到过无数的学生和无数的教学情境。其中&#xff0c;有一个问题始终困扰着我&#xff1a;在某些情况下&#xff0c;我能否用“罚钱”的方式来纠正学生的行为&#xff1f;当然&#xff0c;这还涉及到许多复杂的因素&#xff1a;学校的规…

Pandas快问快答1-15题

如果你是一名使用python进行过数据处理的程序员&#xff0c;那你对Pandas必然不陌生。pandas是一个开源的第三方Python库&#xff0c;旨在提供快速、灵活和富有表现力的数据结构&#xff0c;以便能够简单、直观地处理关系型和标记型数据。它的名字来源于面板数据&#xff08;Pa…

Linux项目的挂起与结束

后台挂起 nohup java -jar java_gobang.jar & 结束项目 先查询pid ps -ef | grep java_gobang 结束&#xff1a; kill -9 23183

Ruoyi-Cloud-Plus_Nacos配置服务漏洞CVE-2021-29441_官方解决方法以及_修改源码解决---SpringCloud工作笔记199

CVE-2021-29441 这个漏洞是Nacos的,通过使用postman,直接访问接口: 就可以直接添加nacos的用户 Nacos是Alibaba的一个动态服务发现、配置和服务管理平台。攻击者通过添加Nacos-Server的User-Agent头部将可绕过(nacos.core.auth.enabled=true)鉴权认证,从而进行API操作。 …

工业智能网关构建智慧污水处理远程监测及管理

污水处理厂是为了处理生活污水和工业废水而建立的设施。为了监测和控制污水处理过程&#xff0c;现代污水处理厂采用了智能工业网关物联网技术。智慧污水系统能够通过工业网关远程监测厂内各个环节的运行情况&#xff0c;提高处理效率和管理水平。 智能工业网关能够将不同设备…

C语言第十六弹---操作符(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 操作符 1、下标访问[]、函数调用() 1.1、[ ] 下标引用操作符 1.2、函数调用操作符 2、结构成员访问操作符 2.1、结构体 2.1.1、结构的声明 2.1.2、结构体变…

wordpress怎么做产品展示站?推荐使用MOK主题和ent主题

大多数WordPress站点都是个人博客网站&#xff0c;主要以文章性质的图文为主。不过部分站长想要用WordPress搭建一个产品展示站&#xff0c;应该怎么做呢&#xff1f; 其实&#xff0c;WordPress可以用来建立各种各样的博客网站&#xff0c;包括个人博客、企业网站、商城、影视…

Node需要了解的知识

一:Node能执行javascript的原因。 浏览器之所以能执行Javascript代码&#xff0c;因为内部含有v8引擎。Node.js基于v8引擎封装&#xff0c;因此可以执行javascript代码。Node.js环境没有DOM和BOM。DOM能访问HTML所有的节点对象&#xff0c;BOM是浏览器对象。但是node中提供了c…

vue全家桶之路由管理Vue-Router

一、前端路由的发展历程 1.认识前端路由 路由其实是网络工程中的一个术语&#xff1a; 在架构一个网络时&#xff0c;非常重要的两个设备就是路由器和交换机。当然&#xff0c;目前在我们生活中路由器也是越来越被大家所熟知&#xff0c;因为我们生活中都会用到路由器&#…

(007)Gradle 找不到符号

问题 明明类的定义存在&#xff0c;gradle编译时&#xff0c;去报找不到符号&#xff1a; 解决 强制刷新gradle缓存&#xff1a;&#xff08;C:\Users\Administrator.gradle\caches&#xff09; ./gradlew build --refresh-dependencies -Penvtestout

Error: Projects must list all files or use an ‘include‘ pattern.

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Java安装环境(MacOS)JDK+Maven+Idea插件+nvm等

Java安装环境(MacOS)JDKMavenIdea插件nvm等 背景&#xff1a;新机安装开发环境发现需要找很多文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;这里一篇文章安装所有环境 文章目录 Java安装环境(MacOS)JDKMavenIdea插件nvm等一、安装JDK①&#xff1a;下载②&#xff1a;…

【全网最全】2024美赛ABCDEF题思路模型全解(后续会更新)

欲获取更多资料&#xff0c;一定要点击这里并关注文末的公众号&#xff01;&#xff01;&#xff01; 最新更新&#xff1a;我们团队不仅在第一时间更新了24美赛全题目的深度翻译和深入分析&#xff0c;经过爆肝奋战&#xff0c;我们在第一时间给出了ABCDEF全题目的完整建模过程…

《Nature Physics》:时间是可逆的

在物理学意义上&#xff0c;时间被视为一个维度。它表示一种连续的过程&#xff0c;从过去流向未来&#xff0c;与空间共同构成了四维时空。因此&#xff0c;时间是标注事件发生瞬间及持续过程的基本物理量。与宏观物质世界关联的度量时间常用年、世纪、光年等&#xff0c;与微…