【问题标题】:Java and docker based on alpine基于alpine的Java和docker
【发布时间】:2017-02-08 12:31:48
【问题描述】:

我有一个想要在 alpine 中运行的 Java 应用程序。它有一个图形用户界面。我正在构建基于 alpine/latest 的图像。安装了所有必需的软件包后,当我运行应用程序时,我看到以下错误:

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

在我看来,这似乎是 glibc 库的版本兼容性问题。 有关已安装 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# 

不确定它是否相关,但在 libjvm.so 上执行 ldd,结果如下:

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# 

我还在尝试运行的命令上运行了 strace:

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 +++

有什么建议吗?

【问题讨论】:

  • glib != glibc。 Alpine 不使用 glibc,而是使用 musl libc。 Oracle JDK 仅作为与 glibc 链接的二进制文件可用,因此它不适用于 Alpine。你试过 Alpine 的 openjdk8 包吗?我不确定我们是否使用 javafx 支持来构建它。
  • 好吧,我们不构建带有 javafx 支持的 openjdk8。因此,您可以尝试将其添加到 community/openjdk8/APKBUILD 并发送拉取请求,或者等到有人这样做。

标签: java docker glibc alpine


【解决方案1】:

你使用https://github.com/anapsix/docker-alpine-java 吗? 它应该开箱即用。 如果你只是使用纯 alpine 图像https://hub.docker.com/_/alpine/ 它可能会遗漏一些 java 所需的东西。

您是否使用 java.awt.headless=true 启动您的应用程序?

对于 JavaFX,请参阅 JavaFx in headless mode

您应该安装 xvfb 并重试。

【讨论】:

    【解决方案2】:

    我最近在 Alpine Docker 映像中使用 openjdk8 时遇到了一些糟糕的体验。
    vanilla 映像加上 java8 生成了一些没有明确原因的核心转储。 我将相同的设置移至 openjdk Docker 映像(debian),它运行顺利。

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2020-07-29
      • 2020-05-23
      相关资源
      最近更新 更多