1

I have a Java application that I want to run in alpine. It has a GUI. I am building an image based on alpine/latest. Having installed all required packages, when I run the application, I see the following error:

[ERROR] [system.err] GLib (gthread-posix.c): Unexpected error from C library during 'pthread_cond_init': Invalid argument.  Aborting.

which to me seems like version compatibility issue with glibc library. Info about installed glib:

bash-4.3# apk info glib
glib-2.50.2-r0 description:
Common C routines used by Gtk+ and other libs
glib-2.50.2-r0 webpage:
http://www.gtk.org
glib-2.50.2-r0 installed size:
2957312
bash-4.3# 

Not sure if it related, but doing ldd on libjvm.so whows the following:

bash-4.3# ldd /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so
    ldd (0x7f3257095000)
    libm.so.6 => ldd (0x7f3257095000)
    libdl.so.2 => ldd (0x7f3257095000)
    libpthread.so.0 => ldd (0x7f3257095000)
    libc.so.6 => ldd (0x7f3257095000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so)
Error relocating /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so: __getpagesize: symbol not found
Error relocating /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so: gnu_get_libc_release: symbol not found
Error relocating /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so: __isnan: symbol not found
Error relocating /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so: gnu_get_libc_version: symbol not found
Error relocating /opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so: dlvsym: symbol not found
bash-4.3# 

I also ran an strace on the command I am trying to run:

access("/opt/jdk1.8.0_112/lib/amd64/libjava.so", F_OK) = -1 ENOENT (No such file or directory)
access("/opt/jdk1.8.0_112/jre/lib/amd64/libjava.so", F_OK) = 0
open("/opt/jdk1.8.0_112/jre/lib/amd64/jvm.cfg", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=627, ...}) = 0
read(3, "# Copyright (c) 2003, 2013, Orac"..., 4096) = 627
read(3, "", 4096)                       = 0
close(3)                                = 0
stat("/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so", {st_mode=S_IFREG|0755, st_size=16989811, ...}) = 0
getgid()                                = 0
getegid()                               = 0
getuid()                                = 0
geteuid()                               = 0
futex(0x7f7c894f90c8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
open("/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\350!\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=16989811, ...}) = 0
mmap(NULL, 16717288, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7c87f68000
mprotect(0x7f7c88c36000, 2097152, PROT_NONE) = 0
mmap(0x7f7c88e36000, 888832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xcce000) = 0x7f7c88e36000
mmap(0x7f7c88f0f000, 304616, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7c88f0f000
close(3)                                = 0
open("/opt/jdk1.8.0_112/bin/../lib/amd64/jli/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/opt/jdk1.8.0_112/bin/../lib/amd64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/glibc-compat/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260U\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1059160, ...}) = 0
mmap(NULL, 3154224, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7c87c65000
mprotect(0x7f7c87d67000, 2093056, PROT_NONE) = 0
mmap(0x7f7c87f66000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x101000) = 0x7f7c87f66000
close(3)                                = 0
mprotect(0x7f7c87f66000, 4096, PROT_READ) = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f7c89a48000
mprotect(0x7f7c89a48000, 4096, PROT_NONE) = 0
clone(child_stack=0x7f7c89b47ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f7c89b489d0, tls=0x7f7c89b48700, child_tidptr=0x7f7c89b489d0) = 337
futex(0x7f7c89b489d0, FUTEX_WAIT, 337, NULLGLib (gthread-posix.c): Unexpected error from C library during 'pthread_cond_init': Invalid argument.  Aborting.
 <unfinished ...>
+++ killed by SIGABRT +++

Any tips?

user3111525
  • 5,013
  • 9
  • 39
  • 64
  • glib != glibc. Alpine does not use glibc, but musl libc. Oracle JDK is available only as binaries linked against glibc, so it does not work on Alpine. Have you tried Alpine’s openjdk8 package? I’m not sure if we build it with javafx support. – Jakub Jirutka Feb 09 '17 at 18:51
  • Well, we don’t build openjdk8 with javafx support. So you may try to add it into [community/openjdk8/APKBUILD](https://github.com/alpinelinux/aports/blob/master/community/openjdk8/APKBUILD) and send a pull request, or wait until someone do it. – Jakub Jirutka Feb 09 '17 at 19:36

2 Answers2

0

Do you use https://github.com/anapsix/docker-alpine-java ? It should work out of the box. If you just use plain alpine image https://hub.docker.com/_/alpine/ it may miss some things required for java.

do you start your app with java.awt.headless=true?

For JavaFX see JavaFx in headless mode

You should install xvfb and try again.

Bartosz Bilicki
  • 12,599
  • 13
  • 71
  • 113
0

I had some bad experience with openjdk8 in Alpine Docker images recently.
The vanilla image plus java8 generated some core dumps without a clear reason. I moved the same setup to an openjdk Docker image (debian) and it runs smoothly.

rubenafo
  • 509
  • 1
  • 7
  • 23