我们有一个Java应用程序,它使用第三方(Asposee,但我不认为这在这里有什么关系)生成word文档。
FROM openjdk:10-jdk-slim
COPY target/*.jar /opt/
CMD $JAVA_HOME/bin/java $JAVA_OPTS -jar /opt/*.jar
当我们在本地构建应用程序(mvn package
,然后docker build
)并在k8s
内运行应用程序时,它运行得很好。
然而,当我们使用Jenkins在CI/CD管道中构建图像时,在运行一个显然需要额外字体的特定进程时,我们会遇到一个运行时异常:
Caused by: java.lang.NullPointerException: null
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1288)
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:765)
at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:440)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:385)
at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
在这种情况下,项目是在Jenkins中buit的,由docker映像maven:3.5.4-jdk-10-slim
编译。
我已经检查了两个jar文件(本地的和来自jenkins的),类文件是相同的(正如预期的那样)。
在这两种情况下,它是相同的基础图像,所以我不明白有什么不同。是什么不同的Docker时,本地建设与另一个Docker容器?
编辑
我们研究了两个docker图像,发现了以下差异。
由于本地构建的映像ls -l /usr/lib
返回:
drwxr-xr-x 2 root root 4096 May 3 2017 X11
drwxr-xr-x 5 root root 4096 Apr 26 00:00 apt
drwxr-xr-x 2 root root 4096 May 26 08:31 binfmt.d
drwxr-xr-x 2 root root 4096 Jun 6 01:50 cgmanager
drwxr-xr-x 2 root root 4096 Jun 6 01:50 dbus-1.0
drwxr-xr-x 2 root root 4096 Jun 6 01:51 dconf
drwxr-xr-x 3 root root 4096 Jun 6 01:51 debug
drwxr-xr-x 3 root root 4096 Apr 20 10:08 dpkg
drwxr-xr-x 2 root root 4096 Jun 6 01:50 environment.d
drwxr-xr-x 3 root root 4096 Apr 25 04:56 gcc
drwxr-xr-x 2 root root 4096 Jun 6 01:51 glib-networking
drwxr-xr-x 2 root root 4096 Apr 26 00:00 init
drwxr-xr-x 1 root root 4096 Jun 6 01:51 jvm
drwxr-xr-x 3 root root 4096 Jun 6 01:50 kernel
lrwxrwxrwx 1 root root 20 Mar 4 09:49 libnih-dbus.so.1 -> libnih-dbus.so.1.0.0
-rw-r--r-- 1 root root 34824 Mar 4 09:49 libnih-dbus.so.1.0.0
lrwxrwxrwx 1 root root 15 Mar 4 09:49 libnih.so.1 -> libnih.so.1.0.0
-rw-r--r-- 1 root root 92184 Mar 4 09:49 libnih.so.1.0.0
drwxr-xr-x 3 root root 4096 Mar 29 19:47 locale
drwxr-xr-x 3 root root 4096 Jun 6 01:50 lsb
drwxr-xr-x 1 root root 4096 Jul 21 2017 mime
drwxr-xr-x 2 root root 4096 Jun 6 01:50 modprobe.d
drwxr-xr-x 2 root root 4096 May 26 08:31 modules-load.d
-rw-r--r-- 1 root root 198 Jan 13 23:36 os-release
drwxr-xr-x 3 root root 4096 Jun 6 01:51 ssl
drwxr-xr-x 1 root root 4096 Jun 6 01:50 systemd
drwxr-xr-x 2 root root 4096 Jun 6 01:50 sysusers.d
drwxr-xr-x 2 root root 4096 Jul 21 2017 tar
drwxr-xr-x 15 root root 4096 Feb 11 20:06 terminfo
drwxr-xr-x 1 root root 4096 Jun 6 01:50 tmpfiles.d
drwxr-xr-x 1 root root 4096 Apr 26 00:00 udev
drwxr-xr-x 1 root root 16384 Jun 6 01:51 x86_64-linux-gnu
但Jenkins内部建的图像ls -l /usr/lib
返回:
drwxr-xr-x 5 root root 4096 Jun 25 00:00 apt
drwxr-xr-x 3 root root 4096 Jul 3 01:00 debug
drwxr-xr-x 3 root root 4096 Apr 20 10:08 dpkg
drwxr-xr-x 3 root root 4096 Jun 17 03:36 gcc
drwxr-xr-x 2 root root 4096 Jun 25 00:00 init
drwxr-xr-x 1 root root 4096 Jul 3 01:00 jvm
drwxr-xr-x 1 root root 4096 Jul 12 11:00 locale
drwxr-xr-x 3 root root 4096 Jul 3 01:00 lsb
drwxr-xr-x 1 root root 4096 May 16 07:47 mime
-rw-r--r-- 1 root root 198 Jan 13 23:36 os-release
drwxr-xr-x 3 root root 4096 Jul 3 01:00 ssl
drwxr-xr-x 3 root root 4096 Apr 20 10:08 systemd
drwxr-xr-x 2 root root 4096 May 16 07:47 tar
drwxr-xr-x 15 root root 4096 May 21 08:54 terminfo
drwxr-xr-x 2 root root 4096 Jun 25 00:00 tmpfiles.d
drwxr-xr-x 3 root root 4096 Jun 25 00:00 udev
drwxr-xr-x 2 root root 4096 May 3 2017 X11
drwxr-xr-x 1 root root 4096 Jul 3 01:00 x86_64-linux-gnu
这真的很令人费解,因为我以为Docker总是从相同的Docker文件中生成相同的图像
8条答案
按热度按时间2w3kk1z51#
使用openjdk:8 u111-jdk-alpine,安装dejavu修复了这个问题:
例如:
停靠文件:
ddarikpa2#
安装
libfontconfig1
为我解决了这个问题(来源):zz2j4svz3#
只需在您的Dockerfile中添加以下内容
bt1cpqcv4#
我想我们找到问题了。
当在Jenkins上运行时,我们使用
docker:dind
(Docker inside docker)Docker映像在构建中提供docker
命令。此映像基于Alpine
linux。当运行docker info
时,我们得到以下内容:在Mac上:
关于Jenkins:
Alpine
linux一定缺少这些字体。我们通过在Dockerfile
:不确定这是最低要求的库,但那些做到了窍门:D
pepwfjgg5#
如果你想在Java/Spring中做 Boot ,在
Dockerfile
中添加以下内容对我在java 11中起作用。0dxa2lsx6#
如果您在本地使用Docker桌面运行它并使用Docker文件创建映像。请在Docker文件中从FROM openjdk:8-jdk-alpine更改为FROM adoptopenjdk/openjdk 11:ubi
b91juud37#
在alpine版本中使用openjdk docker图像时,字体出现问题NullPointerException,例如:
采用openjdk/openjdk 11:jre-11.0.11_9-阿尔卑斯山。
您需要将映像更改为完整版本:采用开放式数据库/开放式数据库11:jre-11.0.11_9
oyxsuwqo8#
我也得到了同样的问题,而运行下面的命令和重新启动应用服务器解决了这个问题。是的,安装fontconfig