1.问题背景
需求需要做一个场所码下载的需求,后端接口实现使用的是AWT
[1]。在本地Windows开发环境联调接口一切正常,当部署到测试环境Linux服务器上之后,前端同事反馈下载的图片如下:
这个问题其实不能算是乱码,而是字体缺失,图片中的汉字使用了微软雅黑
字体,而测试环境使用的是docker部署,没有这个字体,下次遇到这种问题,记得首先检查字体文件。
2.排查过程
我这个模块的代码是从其他现有模块的功能中copy过来的,所以我将其他模块下的字体文件全部copy到我的模块下,
然后修改dockerfile
重新进行Jenkins部署,
# 照抄加了一行
COPY ./fonts /usr/share/fonts/truetype/dejavu/
然后构建失败了,查询日志报错如下:
Step 10/11 : COPY ./hil-wpms-service/hil-wpms-main/fonts /usr/share/fonts/truetype/dejavu/
COPY failed: stat /var/lib/docker/tmp/docker-builder659582304/hil-wpms-service/hil-wpms-main/fonts: no such file or directory
Build step 'Execute shell' marked build as failure
Finished: FAILURE
很明显找不到这个/fonts
文件夹,我首先怀疑的是不是目录写错了,因为我的模块dockerfile
和/fonts
的相对位置和我copy的模块不同,因此我修改了我的dockerfile
COPY ./hil-wpms-service/hil-wpms-main/fonts /usr/share/fonts/truetype/dejavu/
重新进行Jenkins部署,还是失败并且同样的报错,那么就说明不是相对目录错误的问题。
接下来,我又从头看了一遍Jenkins的控制台输出,发现在前面的有一段日志如下:
[203-imedical-hil-wpms] $ /bin/sh -xe /tmp/jenkins7231167455629774297.sh
channel stopped
+ cd /var/lib/jenkins/workspace/203-imedical-hil-wpms/hil-wpms-service/hil-wpms-main/target
+ sudo cp -f hos-hil-wpms-main-1.0.0.RELEASE.jar /usr/local/hil/wpms/main/
+ cd /var/lib/jenkins/workspace/203-imedical-hil-wpms/hil-wpms-service/hil-wpms-main/script/centos/
+ sudo cp -f Dockerfile /usr/local/hil/wpms/main/
+ cd /var/lib/jenkins/workspace/203-imedical-hil-wpms
+ cd /usr/local/hil/wpms/main/
++ date '+%Y-%m-%d %H:%M:%S'
+ echo 2023-12-20 11:57:35 启动docker容器
2023-12-20 11:57:35 启动docker容器
+ docker build -t hil-wpms-main:v1 .
Sending build context to Docker daemon 268.1MB
看起来是将编译完成的jar包和dockerfile
复制到指定的目录下,并且最后cd到了指定的目录,那么会不会是我的Jenkins脚本没有复制/fonts
呢?对比了成功运行的模块的Jenkins的配置和我的模块的Jenkins的配置,果然是脚本少了一段。
少的一段是在Jenkins的配置的Execute shell
中,如下:
cd /var/lib/jenkins/workspace/203-imedical-hil-wpms/hil-wpms-service/hil-wpms-main/
sudo cp -r -f fonts /usr/local/hil/wpms/main/
那么上面那段日志就是执行Jenkins配置的Execute shell的日志,我没有将/fonts
复制到/usr/local/hil/wpms/main/
下,那么自然在后面的dockerfile
执行COPY ./fonts /usr/share/fonts/truetype/dejavu/
时会报错no such file or directory
。
3.问题解决
问题找到,那么将dockerfile
的路径改回来,然后再Jenkins的Execute shell中添加复制语句,重新执行Jenkins构建,成功,下载图片正常,
问题解决。
文末注释:
AWT(Abstract Window Toolkit)是 Java 的一个图形用户界面(GUI)工具包。 ↩︎