无法在 docker 容器中加载 libjli.so

Posted

技术标签:

【中文标题】无法在 docker 容器中加载 libjli.so【英文标题】:Can not load libjli.so in docker container 【发布时间】:2017-11-17 20:31:11 【问题描述】:

我有一个基于 docker 容器的 ruby​​ 应用程序。其中之一是从 openjdk:8 构建的 Flyway。本地(osx sierra)一切正常。但是当我尝试在我的服务器上构建和启动它时,它失败了:

flyway_1    | /flyway/jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

我的环境:

CentOS Linux 版本 7.3.1611(核心) Docker 版本 17.03.1-ce,构建 c6d412e docker-compose 版本 1.13.0,构建 1719ceb

Flyway dockerfile:

FROM openjdk:8

RUN apt-get update && apt-get install -f -y postgresql-client

COPY ./vendor/flyway/ /flyway
COPY ./db/migrate.sh /flyway
RUN ln -s /flyway/flyway /usr/local/bin/flyway

WORKDIR /flyway
CMD ["bash", "migrate.sh"]

我有点卡住了 - 有什么办法可以解决这个问题?

UPD 1.

由于某种原因,我的本地 flyway 容器为 flyway 使用的 java 正确定义了变量:

➜  docker-compose run --no-deps flyway /bin/bash
root@53574d9805a7:/flyway# ldd ./jre/bin/java 
    linux-vdso.so.1 (0x00007fff9bcd2000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa9720da000)
    libjli.so => /flyway/./jre/bin/../lib/amd64/jli/libjli.so (0x00007fa971ec4000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa971cc0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa971922000)
    /lib64/ld-linux-x86-64.so.2 (0x0000563539cb3000)

并且部署到服务器的相同容器没有 libjli.so 的路径:

➜  sudo docker-compose run --no-deps flyway /bin/bash
root@32d0575719ce:/flyway# ldd ./jre/bin/java 
    linux-vdso.so.1 (0x00007ffe24d53000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbb35053000)
    libjli.so => not found
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbb34e4f000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbb34ab1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbb35277000)

也许是飞行路线问题?但是为什么它在完全相同的容器中会有所不同呢?

【问题讨论】:

您是否尝试更改图像库?我正在阅读这个问题,并找到了一些关于它的报告,但他们只提到了基于 alpine 的图像。 @German 我没有使用 alpine,我尝试过版本 7、8 和 9 - 都是一样的东西。我在 github 上看到了相同的讨论,但不幸的是,它没有帮助。主要令人困惑的时刻是,在我的 macbook 上,它完美地从同一来源构建 您是否尝试手动定义 LD_LIBRARY_PATH?这样做是不切实际的,但他们说那行得通。 @German,会检查一下,LD_LIBRARY_PATH 是在我的mac上定义的 LD_LIBRARY_PATH 做任何事情:/ 【参考方案1】:

像往常一样,答案比你想象的要简单——flyway 总是使用自己的 java 库,所以如果你使用自动生成的 .gitignore 文件,你需要检查 *.so 文件是否没有从 flyway 目录中排除。

我修复了.gitignore,推送了一个新的提交并在服务器上使用它,现在它可以正常工作了。

【讨论】:

以上是关于无法在 docker 容器中加载 libjli.so的主要内容,如果未能解决你的问题,请参考以下文章

如何在Spring容器中加载自定义的配置文件

在开发容器和电子中加载共享库时出错

Docker扩展内容之容器环境变量

QDeclarativeImageProvider 不在容器中加载图像

在 .net 核心应用程序中加载标准库

如何使用 NGINX、PHP-FPM 在 docker-compose.yml 文件中加载 mysqli 扩展