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.mfbz.cn/a/364446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯51单片机入门记录】LED

目录 一、基础 &#xff08;1&#xff09;新建工程 &#xff08;2&#xff09;编写前准备 二、LED &#xff08;1&#xff09;点亮LED灯 &#xff08;2&#xff09;LED闪烁 延时函数的生成&#xff08;stc-isp中生成&#xff09; 实现 &#xff08;3&#xff09;流水灯…

flutter GridView控件实践

gridView顶部自带padding问题 如图所示&#xff1a; 顶部有一个比较大的padding。 如何处理&#xff1a;给gridView设置&#xff1a;padding: EdgeInsets.zero,

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

本文包括以下内容&#xff1a; &#xff08;1&#xff09;数独游戏的核心算法&#xff1b; &#xff08;2&#xff09;数独游戏核心算法的源代码&#xff1b; &#xff08;3&#xff09;数独游戏的部分题目样本&#xff1b; &#xff08;4&#xff09;适老版《数独》的设计原则…

JAVA操作Rabbitmq-原理讲的很详细

这篇文章来源于稀土掘金&#xff0c;来源&#xff1a;https://juejin.cn/post/7132268340541653005&#xff0c;主要用来收藏学习。 常见的消息队列很多&#xff0c;主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ&#xff0c;相关的选型可以看我之前的系列&#xff0c;这篇文…

用Python处理TDC激光测距数据并绘制为图片

用Python处理TDC激光测距数据并绘制为图片 说明一、定义全局变量变二、主函数入口三、处理原始文件数据四、将数据叠加统计生成图片五、额外的辅助函数六、将数据进行各种形式统计叠加七、原始数据形式八、 测试结果 说明 1. 主要是将TDC激光测距数据进行统计叠加并绘制为图片…

09. 配置Eth-Trunk

文章目录 一. 初识Eth-Trunk1.1. Eth-Trunk的概述1.2. Eth-Trunk的优势1.3. Eth-Trunk的模式的优势 二. 实验专题2.1. 实验1&#xff1a;手工模式2.1.1. 实验拓扑图2.1.2. 实验步骤&#xff08;1&#xff09;配置PC机的IP地址&#xff08;2&#xff09;在交换机接口划入VLAN&am…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16&#xff1a;系统负载指数5. Processes: 1096系统正在运…

防火墙 双机热备直路部署--上下三层配置

双机热备直路部署 -- 上下三层 双机热备直路部署的特点是防火墙接口都是三层工作模式&#xff0c;相当于防火墙在进行路由部 署。 1. 根据网段划分配置IP地址和安全区域 AR1配置: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huawei-GigabitEthernet…

Codeforces Round 893 (Div. 2)补题

Buttons(Problem - A - Codeforces) 题目大意&#xff1a;有三排按钮数量分别为a,b,c&#xff0c;第一排只能由A按下&#xff0c;第二排只能由B按下&#xff0c;第三排可以被任意一个人按下&#xff0c;问两人轮流游戏&#xff0c;谁没有可以按的谁输&#xff0c;问如果都发挥…

易语言系列学习1

通过本文章你会学习到 如果 如果真 获取编辑框内容 关闭本程序 监听按键让它等价于点击某个按钮 运算&#xff1a;或 且 非&#xff08;注意中间要有一个空格&#xff0c;否则会报错&#xff09; 效果 .版本 2.程序集 窗口程序集_启动窗口.子程序 _按钮2_被单击. 如果真 (编…

C#,斯特林数(Stirling Number)的算法与源代码

1 斯特林数 在组合数学&#xff0c;斯特林数可指两类数&#xff0c;第一类斯特林数和第二类斯特林数&#xff0c;都是由18世纪数学家James Stirling提出的。它们自18世纪以来一直吸引许多数学家的兴趣&#xff0c;如欧拉、柯西、西尔沃斯特和凯莱等。后来哥本哈根&#xff08;…

使用 postcss-cva 来生成 cva 方法吧

使用 postcss-cva 来生成 cva 方法吧 使用 postcss-cva 来生成 cva 方法吧 什么是 cva 封装示例组成参数 postcss-cva 的功能 Css 示例原子化设计注释参考生成cva函数 Refers 什么是 cva cva 全称为 class-variance-authority, 它是一个非常适合制作那种&#xff0c;创建控…

Ps:自动混合图层

Ps菜单&#xff1a;编辑/自动混合图层 Edit/Auto-Blend Layers 自动混合图层 Auto-Blend Layers命令可以自动地混合多个图层&#xff0c;特别适合于制作全景图、焦点堆叠、曝光合成或任何需要平滑融合多个图像的场景。 自动混合图层命令仅适用于 RGB 或灰度图像&#xff0c;不适…

2024年美国大学生数学建模B题思路分析 - 搜索潜水器

# 1 赛题 问题B&#xff1a;搜索潜水器 总部位于希腊的小型海上巡航潜艇&#xff08;MCMS&#xff09;公司&#xff0c;制造能够将人类运送到海洋最深处的潜水器。潜水器被移动到该位置&#xff0c;并不受主船的束缚。MCMS现在希望用他们的潜水器带游客在爱奥尼亚海底探险&…

shell脚本-免交互

一、Here Document免交互&#xff1a; 1.交互概述&#xff1a; 交互&#xff1a;当计算机播放某多媒体程序的时候&#xff0c;编程人员可以发出指令控制该程序的运行&#xff0c;而不是程序单方面执行下去&#xff0c;程序在接受到编程人员相应的指令后而相应地做出反应。 对于…

html,css,js速成

准备&#xff1a;vscode配好c&#xff0c;python&#xff0c;vue环境。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签&#xff0c;填充文本&#xff0c;结束标签构成。 常见标签说明<b></b>粗体<i></i>…

UE4学习笔记 FPS游戏制作3 添加武器

文章目录 章节目标为骨骼添加武器挂载点添加武器 章节目标 本章节为手部添加一个武器挂载点&#xff0c;并挂载一个武器 为骨骼添加武器挂载点 添加挂载点需要以一个动画片段为基础&#xff0c;为骨骼添加挂载点。 首先找到我们需要的动画片段&#xff0c;通常是idle 双击打…

CentOS 7中搭建NFS文件共享服务器的完整步骤

CentOS 7中搭建NFS文件共享服务器的完整步骤 要求&#xff1a;实现镜像文件共享&#xff0c;并基于挂载的共享目录配置yum源。 系统环境&#xff1a; 服务器&#xff1a;172.20.26.167-CentOS7.6 客户端&#xff1a;172.20.26.198-CentOS7.6 1、在服务器和客户端上&#x…

AI 原生时代的云计算

本文整理自2023年 12 月 20 日举办的「2023 百度云智大会智算大会」主论坛&#xff0c;百度副总裁谢广军的主题演讲《AI 原生时代的云计算》。 &#xff08;视频回放链接&#xff1a;https://cloud.baidu.com/summit/aicomputing_2023/index.html&#xff09; 大模型的到来&…

leetcode 19 , 118

19 .删除链表倒数第n个节点 思路1&#xff1a; 我首先想到的就是使用两个loop来进行解决&#xff1a; 遍历所有节点&#xff0c;得到需要删除节点的位置。再遍历一边所有节点&#xff0c;找到需要删除节点进行删除。 解决方案1&#xff1a; class Solution {public ListNod…