当前位置: 首页 > news >正文

优化Docker部署:解决Java应用ExcelGenerateException并提速镜像构建

在开发和部署应用时,经常会遇到在本地环境运行正常,但迁移到Docker容器后出现特定错误的情况。本篇博客将聚焦于解决一个具体问题:当使用Docker部署包含Excel生成功能的Java应用程序时,遇到ExcelGenerateException的排查与解决方法。

1. 问题现象

  • 本地环境:应用程序能够顺利生成Excel文件,无任何异常。
  • Docker环境:部署相同的应用程序后,在执行Excel生成操作时,系统抛出ExcelGenerateException。

例如:

Dockerfile文件:

FROM java:8-alpine
COPY ./docker-demo.jar /tmp/demo-0.0.1-SNAPSHOT.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/demo-0.0.1-SNAPSHOT.jar

部署后报错: 

com.alibaba.excel.exception.ExcelGenerateException: Create workbook failureat com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:88) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:39) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:104) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.zjp.demo.service.impl.ExportImpl.export(ExportImpl.java:632) ~[classes!/:na]at com.zjp.demo.service.impl.ExportImpl$$FastClassBySpringCGLIB$$93118298.invoke(<generated>) ~[classes!/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.23.jar!/:5.3.23]at com.zjp.demo.service.impl.ExportImpl$$EnhancerBySpringCGLIB$$df7a6b3d.riskSurveyExport(<generated>) ~[classes!/:na]at com.zjp.demo.controller.StatisController.riskSurveyExport(StatisController.java:97) ~[classes!/:na]at com.zjp.demo.controller.StatisController$$FastClassBySpringCGLIB$$3f0e2a16.invoke(<generated>) ~[classes!/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-5.3.23.jar!/:5.3.23]at com.zjp.demo.aop.LogRecordAspect.doAround(LogRecordAspect.java:65) ~[classes!/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar!/:5.3.23]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.23.jar!/:5.3.23]at com.zjp.demo.controller.StatisController$$EnhancerBySpringCGLIB$$bebb4c75.riskSurveyExport(<generated>) ~[classes!/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar!/:5.3.23]at javax.servlet.http.HttpServlet.service(HttpServlet.java:772) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:211) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.websocket.server.WsFilter.doFilter(WsFilter.java:53) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) [spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar!/:5.3.23]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) [spring-boot-actuator-2.6.13.jar!/:2.6.13]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar!/:5.3.23]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.23.jar!/:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar!/:5.3.23]at com.cvicse.bixi.kernel.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:180) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardWrapperValve.invoke(StandardWrapperValve.java:178) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardContextValve.invoke(StandardContextValve.java:92) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:527) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardHostValve.invoke(StandardHostValve.java:133) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.kernel.StandardEngineValve.invoke(StandardEngineValve.java:77) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.connector.BixiConnectorAdapter.service(BixiConnectorAdapter.java:341) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.http11.Http11Processor.service(Http11Processor.java:363) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.AbstractProcessorLight.process(AbstractProcessorLight.java:64) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.bixi.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:958) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1757) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1196) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:664) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at com.cvicse.inforsuite.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [spring-boot-starter-inforsuite-10.0.2.4.jar!/:na]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) ~[na:1.8.0_212]at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) ~[na:1.8.0_212]at sun.awt.FontConfiguration.init(FontConfiguration.java:107) ~[na:1.8.0_212]at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) ~[na:1.8.0_212]at sun.font.SunFontManager$2.run(SunFontManager.java:431) ~[na:1.8.0_212]at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_212]at sun.font.SunFontManager.<init>(SunFontManager.java:376) ~[na:1.8.0_212]at sun.awt.FcFontManager.<init>(FcFontManager.java:35) ~[na:1.8.0_212]at sun.awt.X11FontManager.<init>(X11FontManager.java:57) ~[na:1.8.0_212]at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_212]at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_212]at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_212]at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_212]at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_212]at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) ~[na:1.8.0_212]at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_212]at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) ~[na:1.8.0_212]at java.awt.Font.getFont2D(Font.java:491) ~[na:1.8.0_212]at java.awt.Font.canDisplayUpTo(Font.java:2060) ~[na:1.8.0_212]at java.awt.font.TextLayout.singleFont(TextLayout.java:470) ~[na:1.8.0_212]at java.awt.font.TextLayout.<init>(TextLayout.java:531) ~[na:1.8.0_212]at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273) ~[poi-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.<init>(SXSSFWorkbook.java:247) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.<init>(SXSSFWorkbook.java:211) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at org.apache.poi.xssf.streaming.SXSSFWorkbook.<init>(SXSSFWorkbook.java:186) ~[poi-ooxml-4.1.2.jar!/:4.1.2]at com.alibaba.excel.util.WorkBookUtil.createWorkBook(WorkBookUtil.java:42) ~[easyexcel-3.0.0-beta1.jar!/:na]at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:86) ~[easyexcel-3.0.0-beta1.jar!/:na]... 83 common frames omitted

2. 原因分析

该异常通常源于容器环境中缺少必要的字体配置和支持库,影响了如Apache POI等Excel处理库的正常运作。

3. 解决策略:修改Dockerfile

  1. 选做:通过添加 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 命令替换默认的Alpine Linux软件包源为阿里云镜像站,显著提升软件包下载速度。
  2. 选做:更新软件包索引:RUN apk update
  3. 核心:在Dockerfile中,通过添加 RUN apk add --no-cache fontconfig ttf-dejavu 命令找到或添加一个合适的环节来安装fontconfig和ttf-dejavu包。这些包提供了必要的字体支持,有助于避免Excel生成时的异常。

最终修改方案为:

FROM java:8-alpine# 更换默认软件源为阿里云镜像站
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# 更新软件包索引
RUN apk update# 安装字体和配置库
RUN apk add --no-cache fontconfig ttf-dejavuCOPY ./docker-demo.jar /tmp/demo-0.0.1-SNAPSHOT.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/demo-0.0.1-SNAPSHOT.jar

相关文章:

优化Docker部署:解决Java应用ExcelGenerateException并提速镜像构建

在开发和部署应用时&#xff0c;经常会遇到在本地环境运行正常&#xff0c;但迁移到Docker容器后出现特定错误的情况。本篇博客将聚焦于解决一个具体问题&#xff1a;当使用Docker部署包含Excel生成功能的Java应用程序时&#xff0c;遇到ExcelGenerateException的排查与解决方法…...

你了解RabbitMQ、RocketMQ和Kafka吗?

是的&#xff0c;我了解 RabbitMQ、RocketMQ 和 Kafka。以下是对这三种消息队列系统的详细介绍&#xff1a; RabbitMQ 概念 RabbitMQ 是一个由 Pivotal 开发的开源消息代理&#xff0c;基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议。它支持多种…...

python实现可视化大屏(django+pyechars)

1.实现效果图 2.对数据库进行迁移 python manage.py makemigrations python manage.py migrate 3.登录页面 {% load static%} <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…...

Leetcode 力扣 125. 验证回文串 (抖音号:708231408)

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…...

Java程序递归及mybatis递归查询

之前项目组有个需求&#xff0c;定时同步机构的信息。已知三方接口由于返回数据量很大&#xff0c;所以最后需要三方提供一个可根据机构编号获取当前机构及子机构信息的接口。而不是一次性返回全部机构信息&#xff01; 由于这次需求也用到了递归&#xff0c;所以记录下&#…...

苹果电脑安装双系统步骤 教你苹果电脑如何装双系统

许多人刚买来苹果电脑时&#xff0c;对苹果的IOS操作系统比较陌生&#xff0c;显得非常不适应&#xff0c;都会去想吧苹果电脑去安装一个自己熟悉的Windows系统&#xff0c;方便自己办公娱乐&#xff0c;那么苹果电脑安装双系统的步骤怎么样呢 小编给大家介绍下吧。 许多人刚买…...

Axios-入门

介绍 Axios对原生Ajax进行了封装&#xff0c;简化书写&#xff0c;快速开发 官网&#xff1a;Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求&#xff0c;并获取响应…...

Python22 Pandas库

Pandas 是一个Python数据分析库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。这个库适用于处理和分析输入数据&#xff0c;常见于统计分析、金融分析、社会科学研究等领域。 1.Pandas的核心功能 Pandas 库的核心功能包括&#xff1a; 1.数据结构&#xff…...

不同表格式下的小文件治理方式(开源RC file/ORC/Text非事务表、事务表、Holodesk表格式..)

友情链接&#xff1a; 小文件治理系列之为什么会出现小文件问题&#xff0c;小文件过多问题的危害以及不同阶段下的小文件治理最佳解决手段 小文件过多的解决方法&#xff08;不同阶段下的治理手段&#xff0c;SQL端、存储端以及计算端&#xff09; 概览 在前两篇博文中&am…...

0.7 模拟电视标准 PAL 简介

0.7 模拟电视标准PAL PAL 是一种用于模拟电视的彩色编码系统&#xff0c;全名为逐行倒相&#xff08;Phase Alternating Line&#xff09;。它是三大模拟彩色电视标准之一&#xff0c;另外两个标准是 NTSC 和 SECAM。“逐行倒相”的意思是每行扫描线的彩色信号会跟上一行倒相&…...

vue项目中封装element分页组件

我们都知道封装组件是为了方便在项目中使用&#xff0c;全局封装之后哪个模块使用直接复制就行了&#xff0c;分页在后台项目中用到的地方也是很多的&#xff0c;所以我们就全局封装一下分页组件&#xff0c;以后也方便在项目中使用&#xff0c;接下来封装的这个分页也是elemen…...

linux下docker安装与镜像容器管理

linux下docker安装与镜像容器管理 原文链接&#xff1a;linux下docker安装与镜像容器管理 导言 ubuntu22.04-docker engine安装&#xff0c;以及镜像容器管理 docker非常简单介绍 docker就是一个虚拟化容器&#xff0c;image是镜像&#xff0c;就是一个dockerfile指明这个镜…...

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期:2024年6月26日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色(刷角色)3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色简介 上一篇完成的关卡编辑器已支持创建关卡环境(主要由地块单元组…...

【鸿蒙】鸿蒙的Stage和 FA 有什么区别

鸿蒙的Stage模型和FA&#xff08;Feature Ability&#xff09;模型在多个方面存在显著的区别。以下是它们之间的主要差异点&#xff1a; 设计思想和出发点&#xff1a; Stage模型&#xff1a;设计基于为复杂应用而开发的出发点&#xff0c;旨在提供一个更好的开发方式&#xff…...

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式&#xff0c;用于读取和写入数据。IO流主要用于处理数据传输&#xff0c;可以将数据从一个地方传送到另一个地方&#xff0c;例如从内存到硬盘&#xff0c;从网络到内存等。IO流在编程中非常常见&#xff0c;特别是在文件操作和…...

大学生毕业季,寄物流快递避雷指南

随着毕业季的来临&#xff0c;大学生们纷纷开始整理自己的行李&#xff0c;准备离开校园&#xff0c;踏入社会。 在这个过程中&#xff0c;寄送快递成为了一个不可或缺的环节。然而&#xff0c;在寄送快递的过程中&#xff0c;如果不注意一些细节&#xff0c;很容易遭遇各种“…...

如何提高项目风险的处理效率?5个重点

提高项目风险的处理效率&#xff0c;有助于迅速识别和应对风险&#xff0c;减少风险导致的延误&#xff0c;降低成本&#xff0c;提升项目质量&#xff0c;确保项目按时交付。如果项目风险处理效率较低&#xff0c;未能及时发现和处理风险&#xff0c;导致问题累积&#xff0c;…...

ZNB40 矢量网络分析仪

ZNB40 矢量网络分析仪 100kHz至40GHz的宽频率范围&#xff0c;具有四个端口和附加信号发生器 概述 R&SZNB40 提供 100 kHz 至 40 GHz 的宽频率范围&#xff0c;具有四个端口和附加信号发生器。 罗德与施瓦茨带四个端口和附加内部信号源的 40 GHz 中档矢量网络分析仪&…...

ingress代理前后端服务跨域

一、前言 ingress对于前后端服务的代理有不同的方式可以实现&#xff0c;前后端服务可以通过不同的域名实现流量的分流策略&#xff0c;不过这需要解决前后端域名不同产生的跨域问题&#xff0c;也可以通过不同的path实现流量的分流策略&#xff0c;该方式不会产生跨域的问题 …...

Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai

Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai 1. 下载Basic.zip 和SQL*Plus&#xff08;.zip&#xff09;2. 配置环境变量3. 连接 23ai 1. 下载Basic.zip 和SQL*Plus&#xff08;.zip&#xff09; 到 https://www.oracle.com/database/technologies/instant-clien…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...