如何解决docker运行Java程序导出Excel中文报错的问题?

前言

使用openjdk:17-jdk-slim基础镜像运行Java程序,导出Excel的时候报错。

导出时错误内容如下

java.lang.UnsatisfiedLinkError: /usr/local/openjdk-17/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory

java.lang.InternalError: java.lang.reflect.InvocationTargetException

前期准备,需要安装好docker。

一、进入程序运行的容器

1、进入容器,执行命令如下。

# project替换为容器id或容器名称
docker exec -ti project bash

二、配置apt加速

1、进入apt配置路径,执行命令如下。

cd /etc/apt/

2、备份原来的配置,以备失败后可以回滚,执行命令如下。

cp sources.list sources.list.bak

3、写入阿里云镜像配置,执行命令如下。

# 因为openjdk:17-jdk-slim未安装vim编辑器,所以使用echo直接写入替代
echo "deb http://mirrors.aliyun.com/debian/ bullseye main contrib non-free" > sources.list && echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free" >> sources.list && echo "deb http://mirrors.aliyun.com/debian-security bullseye-security main contrib non-free" >> sources.list

4、验证更新后的镜像,执行命令如下。

apt-get update

执行效果如下图所示。

5、至此,配置apt加速已完成。

三、安装依赖

1、执行命令如下。

apt-get update && apt-get install -y libfreetype6 libfontconfig1 fonts-dejavu fonts-dejavu-core

2、至此,导出Excel的本地相关依赖以及字体已安装完成,接下来就是测试验证呢。

总结

因为使用openjdk:17-jdk-slim基础镜像运行Java程序,导出Excel的时候报错,需要安装本地相关依赖以及字体,但是过程中又遇到更新依赖不成功的问题,需要给apt加速,总结步骤如下。

1、进入程序容器。

2、配置apt加速。

3、安装依赖。

<think>好的,我现在需要帮助用户解决如何在Windows环境下使用Docker运行Java的JAR文件。首先,我得回忆一下Docker的基本操作和相关配置。用户提到了几个引用,可能涉及Dockerfile的编写、挂载配置文件以及可能的依赖问题。 首先,用户的需求是运行JAR包,并且可能需要处理外部配置文件,比如log4j,如引用[1]中提到的问题。这说明在构建Docker镜像时,需要将宿主机的配置文件挂载到容器中,或者在Dockerfile中正确复制这些文件。此外,引用[3]提到了共享库的问题,可能在运行某些Java库时需要注意基础镜像的选择。 接下来,我需要考虑如何在Windows环境下设置Docker。Windows用户通常使用Docker Desktop,并且需要注意文件路径的问题,因为Windows和Linux的路径结构不同。挂载卷的时候需要使用绝对路径,并且可能需要配置Docker Desktop的文件共享设置。 步骤可能包括: 1. 编写Dockerfile,使用合适的基础镜像(比如OpenJDK),复制JAR文件,指定启动命令。 2. 构建镜像时处理依赖项,比如确保libfreetype等库存在,可能需要选择包含这些库的基础镜像,或者在Dockerfile中安装。 3. 运行容器时挂载外部配置文件,比如log4j.xml,这样容器内的JAR可以读取宿主机上的配置文件。 4. 处理端口映射,如果JAR应用需要访问网络端口的话。 5. 处理可能的权限问题,特别是在Windows上挂载卷时。 需要注意的是,用户提供的引用中有关于log4j配置的问题,所以在Dockerfile中可能需要将配置文件复制到容器内,或者在运行时挂载。根据引用[1],用户希望读取JAR外的配置文件,所以挂载卷可能是更好的方法,避免每次修改配置都要重新构建镜像。 另外,引用[3]提到libfreetype.so.6问题,这提示在基础镜像中可能缺少某些依赖库。因此,在Dockerfile中选择合适的基础镜像,比如包含这些库的Java镜像,或者在构建过程中安装所需的库。 总结步骤: 1. 创建Dockerfile,使用FROM指令选择基础镜像(如openjdk:11-jre)。 2. 将JAR文件复制到镜像中,使用COPY或ADD指令。 3. 如果需要,复制配置文件到镜像中,或者通过-v参数挂载。 4. 构建镜像,使用docker build命令。 5. 运行容器,使用docker run命令,指定端口映射和卷挂载。 可能的问题包括路径错误、权限问题、依赖缺失等。需要确保Docker Desktop在Windows上正确配置,特别是文件共享的设置,以便挂载卷正常工作。此外,如果应用需要访问其他服务或网络资源,需配置正确的网络设置。 现在需要将这些步骤整理成用户容易理解的指南,包括示例Dockerfile和运行命令,同时提醒常见的注意事项,比如基础镜像的选择和挂载路径的格式(在Windows中使用绝对路径时可能需要转换路径格式)。</think>在Windows系统中通过Docker运行Java JAR文件,需通过以下步骤配置: --- ### 1. 编写Dockerfile文件 创建包含以下内容的`Dockerfile`(文件名需严格一致): ```dockerfile # 使用含Java环境的基础镜像(推荐使用官方镜像) FROM openjdk:11-jre-slim # 将宿主机的JAR文件复制到容器中 COPY your-app.jar /app.jar # 声明需要暴露的端口(与JAR内配置一致) EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "/app.jar"] ``` - **配置文件挂载**:若需读取外部配置文件(如`log4j.xml`),需通过`VOLUME`指令挂载目录[^1],例如: ```dockerfile VOLUME /config ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.config.location=/config/"] ``` --- ### 2. 构建Docker镜像 在JAR文件目录下执行命令: ```powershell docker build -t my-java-app . ``` - `-t`指定镜像名称,`.`表示使用当前目录的Dockerfile --- ### 3. 运行容器 ```powershell docker run -d -p 8080:8080 -v C:\host\config:/config my-java-app ``` - **参数说明**: - `-d`:后台运行 - `-p 8080:8080`:将宿主机8080端口映射到容器8080端口 - `-v C:\host\config:/config`:挂载宿主机目录到容器内(Windows路径需使用绝对路径) --- ### 常见问题解决方案 1. **依赖缺失**: 若报错`libfreetype.so.6`缺失(如导出Excel时),需使用包含该库的基础镜像,例如: ```dockerfile FROM zxstrive/java11:centos7_jdk-11.0.18 # 引用[3]中提供的镜像 ``` 2. **配置文件优先级**: 通过`--spring.config.location`参数指定外部配置文件路径,优先级高于JAR包内配置。 3. **容器日志查看**: 使用`docker logs <容器ID>`检查启动错误。 --- ### 完整流程示例 1. 目录结构: ``` C:\myapp ├── Dockerfile ├── your-app.jar └── config └── application.properties ``` 2. 运行命令: ```powershell cd C:\myapp docker build -t myapp . docker run -d -p 8080:8080 -v C:\myapp\config:/config myapp ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayzen1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值