Docker和Java-FontConfiguration问题

我们有一个Java应用程序,它使用第三方(Asposee,但我认为这不重要)生成word文档。该应用程序由一个简单的Docker文件构建:

来自openjdk的

:10 jdk slim
复制target/*.jar/opt/
CMD$JAVA_HOME/bin/JAVA$JAVA_OPTS-jar/opt/*.jar

当我们在本地构建应用程序(mvn包然后docker构建)并在k8s内部运行应用程序时,它工作得很好

但是,当我们使用Jenkins在CI/CD管道中构建映像时,在运行特定进程时会出现运行时异常,该进程显然需要额外的字体:

原因:java.lang.NullPointerException:null
位于java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1288)
位于java.desktop/sun.awt.FontConfiguration.readfontconfigufile(FontConfiguration.java:225)
位于java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
位于java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:765)
位于java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:440)
位于java.base/java.security.AccessController.doPrivileged(本机方法)
位于java.desktop/sun.font.SunFontManager;初始化>(SunFontManager.java:385)
位于java.desktop/sun.awt.FcFontManager;初始化>(FcFontManager.java:35)
位于java.desktop/sun.awt.X11FontManager;初始化>(X11FontManager.java:56)

在这种情况下,该项目由docker imagemaven:3.5.4-jdk-10-slim编译而成

我检查了两个jar文件(本地和来自jenkins的)和类文件都是相同的(如预期的)

在这两种情况下,它都是相同的基础图像,所以我不明白有什么不同。在本地构建Docker时与在另一个Docker容器中构建时,Docker中有什么不同吗

编辑

我们查看了两张docker图片,发现了以下区别

由于本地构建的imagels-l/usr/lib返回:

drwxr-xr-x 2根根目录4096 2017年5月3日X11
drwxr-xr-x 5根根目录4096年4月26日00:00 apt
drwxr-xr-x 2根根目录4096年5月26日08:31 binfmt.d
drwxr-xr-x 2根根目录4096 Jun 6 01:50 cgmanager
drwxr-xr-x 2根根目录4096 Jun 6 01:50 dbus-1.0
drwxr-xr-x 2根根目录4096 Jun 6 01:51 dconf
drwxr-xr-x 3根根目录4096 Jun 6 01:51调试
drwxr-xr-x 3根根部4096年4月20日10:08 dpkg
drwxr-xr-x 2根根目录4096 Jun 6 01:50 environment.d
drwxr-xr-x 3根根目录4096年4月25日04:56 gcc
drwxr-xr-x 2根根目录4096 Jun 6 01:51 glib网络
drwxr-xr-x 2根根目录4096年4月26日00:00初始
drwxr-xr-x 1根根目录4096 Jun 6 01:51
drwxr-xr-x 3根根目录4096 Jun 6 01:50内核
lrwxrwxrwx 1根根3月20日09:49 libnih dbus.so.1->libnih dbus.so.1.0.0
-rw-r--r--1根根根34824 Mar 4 09:49 libnih dbus.so.1.0.0
lrwxrwxrwx 1根根根3月15日09:49 libnih.so.1->libnih.so.1.0.0
-rw-r--r--1根根根92184 Mar 4 09:49 libnih.so.1.0.0
drwxr-xr-x 3根根目录4096 Mar 29 19:47语言环境
drwxr-xr-x 3根根目录4096 Jun 6 01:50 lsb
drwxr-xr-x 1根根目录4096 2017年7月21日mime
drwxr-xr-x 2根根目录4096 Jun 6 01:50 modprobe.d
drwxr-xr-x 2根根目录4096年5月26日08:31模块加载.d
-rw-r--r--1根根目录198 Jan 13 23:36操作系统版本
drwxr-xr-x 3根根目录4096 Jun 6 01:51 ssl
drwxr-xr-x 1根根目录4096 Jun 6 01:50 systemd
drwxr-xr-x 2根根目录4096 Jun 6 01:50 sysusers.d
drwxr-xr-x 2根根根4096 2017年7月21日焦油
drwxr-xr-x 15根根根4096 2月11日20:06 terminfo
drwxr-xr-x 1根根目录4096 Jun 6 01:50 tmpfiles.d
drwxr-xr-x 1根根目录4096年4月26日00:00 udev
drwxr-xr-x 1根根目录16384 Jun 6 01:51 x86_64-linux-gnu

但是在Jenkins内部构建的imagels-l/usr/lib返回:

drwxr-xr-x 5根根目录4096六月25日00:00 apt
drwxr-xr-x 3根根目录4096 Jul 3 01:00调试
drwxr-xr-x 3根根部4096年4月20日10:08 dpkg
drwxr-xr-x 3根根目录4096 Jun 17 03:36 gcc
drwxr-xr-x 2根根目录4096 Jun 25 00:00初始
drwxr-xr-x 1根根目录4096 Jul 3 01:00 jvm
drwxr-xr-x 1根根目录4096年7月12日11:00地区设置
drwxr-xr-x 3根根根4096年7月3日01:00 lsb
drwxr-xr-x 1根根目录4096 May 16 07:47 mime
-rw-r--r--1根根目录198 Jan 13 23:36操作系统版本
drwxr-xr-x 3根根目录4096 Jul 3 01:00 ssl
drwxr-xr-x 3根根目录4096年4月20日10:08系统D
drwxr-xr-x 2根根目录4096年5月16日07:47 tar
drwxr-xr-x 15根根根4096 May 21 08:54 terminfo
drwxr-xr-x 2根根目录4096 Jun 25 00:00 tmpfiles.d
drwxr-xr-x 3根根目录4096六月25日00:00 udev
drwxr-xr-x 2根根目录4096 2017年5月3日X11
drwxr-xr-x 1根根目录4096 Jul 3 01:00 x86_64-linux-gnu

这真是令人费解,因为我认为Docker总是会从相同的DockerFile生成相同的图像

使用openjdk:8u111 jdk alpine,安装dejavu可以解决以下问题:

例如:

Dockerfile:

来自openjdk:8u111 jdk的


#需要修复“Fontconfig警告:忽略C.UTF-8:不是有效的语言标记”
环境规划标准GB.UTF-8
#如果图像中没有标准字体,JRE无法加载字体;德哈武是个不错的选择,
#看https://github.com/docker-library/openjdk/issues/73#issuecomment-207816707
运行apk add——更新ttf dejavu&amp&rm-rf/var/cache/apk/*
体积/千兆帕
复制/target/*.jar app.jar
入口点[“java”、“Xmx100m”、“Djava.security.egd=file:/dev//uradom”、“jar”、“app.jar”]

发表评论