Alpine Linux,非root用户,Java 7,Setcap:libjli.so:没有这样的文件或目录(java需要)

在我创build的Alpine Linux docker容器上。 我build立了一个非root用户来运行我的java(jboss)服务器。 我试图给它访问端口<1024上运行。结果,我不得不使用setcap为了提供Java的权限,以便在端口<1024上运行。

请注意,在Alpine Linux上authbind还不存在 ,所以这不是一个选项。 Setcap是推荐的方法。 请参阅最终评论: https : //github.com/gliderlabs/docker-alpine/issues/166

$ setcap cap_net_bind_service=+eip /opt/jdk1.7.0_51/bin/java \ cap_net_bind_service=+eip /opt/jdk1.7.0_51/jre/bin/java 

但是,每个Oracle都有一个解决setcap问题的已知错误(和解决方法): http ://bugs.java.com/view_bug.do?bug_id=7157699

基本上,他们build议用下面的内容创build一个文件。 请注意,我已将java安装到“/opt/jdk1.7.0_51”,这是一个64位版本,所以目录path是不同的。

 $ mkdir -p /etc/ld.so.conf.d $ echo "/opt/jdk1.7.0_51/jre/lib/amd64/jli" > /etc/ld.so.conf.d/java.conf $ cat /etc/ld.so.conf.d/java.conf /opt/jdk1.7.0_51/jre/lib/amd64/jli 

但是,这不起作用。 我也尝试创build文件的链接:

 $ ln -s /opt/jdk1.7.0_51/jre/lib/amd64/jli/libjli.so /lib64/ $ ls -al /lib64 ... ... libjli.so -> /opt/jdk1.7.0_51/jre/lib/amd64/jli/libjli.so ... $ ls /opt/jdk1.7.0_51/jre/lib/amd64/jli/ libjli.so 

这也没有工作。 我曾尝试使用ldconfig在原始文章中build议的debugging问题:

 $ ldconfig | grep libjli 

这不起作用。 Alpine几乎没有文档运行ldconfig的客户版本,所以我还没有弄清楚要做什么。

无论如何,每次我尝试使用ldd进行debugging时,我仍然得到这个错误:

 $ /opt/jdk1.7.0_51/jre/bin$ ldd java /lib64/ld-linux-x86-64.so.2 (0x55901c23e000) libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x55901c23e000) Error loading shared library libjli.so: No such file or directory (needed by java) libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x55901c23e000) libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x55901c23e000) Error relocating java: JLI_Launch: symbol not found 

我不知道在这一点上我能做些什么。 我想避免再次改变我们的软件,使其在阿尔派下工作,因为这需要一个发布过程,并可能会影响尚未在Docker上的客户。 我真的不想再次触摸端口,因为他们在根目录下工作。 我将不得不经过另一个debugging过程来configuration负载平衡器,docker端口redirect,定制重新编译和debugging我们的软件,然后重新testing以上所有内容,以确保我们的自动化脚本正确部署。 这是我想避免的事情。

任何人有build议?

libjli.so的问题似乎是Oracle JDK使用glibc构build,而Alpine使用musl libc。

Java 8的问题已经被打开,我想他们也适用于Java 7:

  • 高山库不兼容Java 8
  • java缺lesslibjli.so:8-jre-alpine

有这个为Alpine提供glibc的Docker镜像 ,您可以将它用作基础。 它已被用于构buildOracle JDK 8映像 。