- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我创建的 Alpine Linux docker 容器上。我已经设置了一个非 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
基本上,他们建议创建一个包含以下内容的文件。请注意,我将java安装到“/opt/jdk1.7.0_51”,这是64位版本,所以目录路径不同。
$ 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
然而,这并没有奏效。我还尝试创建文件链接:
$ 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 按照原始帖子中的建议调试问题:
$ ldconfig | grep libjli
这行不通。 Alpine 运行 ldconfig 的客户版本,文档很少,所以我还没有弄清楚该怎么做。
无论如何,每次我尝试使用 ldd 进行调试时,我仍然会收到此错误:
$ /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
我不知道在这一点上我还能做些什么。我想避免再次更改我们的软件以使其在 alpine 下工作,因为这需要一个发布过程并且可能会影响尚未使用 Docker 的客户。我真的不想再次接触这些端口,因为它们在 root 下工作。我将不得不通过另一个调试过程来配置负载平衡器、docker 端口重定向、自定义重新编译和调试我们的软件,然后重新测试以上所有内容以确保我们的自动化脚本全部正确部署。这是我希望避免的事情。
有人有建议吗?
最佳答案
libjli.so 的问题似乎是 Oracle JDK 是使用 glibc 构建的,而 Alpine 使用 musl libc。
为此打开了 Java 8 的问题,我想它们也适用于 Java 7:
有this Docker image为 Alpine 提供 glibc,您可以将其用作基础。它已被用于构建 Oracle JDK 8 image .
关于java - Alpine Linux,非根用户,Java 7,Setcap : libjli. 所以:没有这样的文件或目录(java 需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45173910/
我在我的机器上运行一个虚拟机,并使用 sshfs(通过 fstab 自动安装)在虚拟机中安装了一个主机文件夹。 abc@xyz:/home/machine/test on /home/vm/test
为防止特权数据逃逸,Linux 上的 setcap 可执行文件不会转储核心: ijw@build$ cat > test.c main() { abort(); } ijw@build$ gcc te
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我使用LD_LIBRARY_PATH 为应用程序设置某个用户库的路径。但是,如果我在此应用程序上设置功能 sudo setcap CAP_NET_BIND_SERVICE=eip myapplicat
我在 CentOS 容器中有一个 tcpdump 应用程序。我试图以非 root 身份运行 tcpdump。关注此论坛帖子:https://askubuntu.com/questions/530920
如何将 cucumber 场景设置为 setCapability 中的 testName DesiredCapabilities dc = new DesiredCapabilities();
我正在使用 Yocto 1.8 构建一个 linux 系统。 我需要使用命令“setcap”在构建期间设置文件功能,这是通过 libcap 包配方引入的:http://cgit.openembedde
我想在 Linux(使用 Python)中打开一个原始套接字,而不为 Python 提供 cap_net_raw 功能。我希望用户拥有这种能力,而不是程序。我正在使用 Ubuntu 12.4。 最佳答
我们在服务器上安装了 Java 11,旨在监视网络接口(interface)的流量。 初始安装(yum install java-11-openjdk-devel.x86_64)后,java 命令对于
我有一个 Debian Stretch 主机: root@jenkins-docker-01:~# lsb_release -a No LSB modules are available. Distr
我已经重新编译了带有前缀/my-path/bin/的最新版本的 Wireshark 和想要设置数据包的非根捕获。但是当我设置 setcap cap_net_raw,cap_net_admin=eip/
我正在尝试使用 IE 在 java selenium 中进行测试,但我的问题是我必须继续在保护模式下配置设置,这是已弃用的替代方案功能 WebDriver driver = new InternetE
在我创建的 Alpine Linux docker 容器上。我已经设置了一个非 root 用户来运行我的 java (jboss) 服务器。我试图授予它在 /etc/ld.so.conf.d/jav
我的linux是CentOS7。 当我以非 root 用户运行 Elastic Beats-Auditbeat 时,它显示此错误: ERROR instance/beat.go:877 Ex
我是一名优秀的程序员,十分优秀!