【问题标题】:Set ldconfig LD_LIBRARY_PATH in a docker container在 docker 容器中设置 ldconfig LD_LIBRARY_PATH
【发布时间】:2021-01-27 21:49:23
【问题描述】:

我有一个 docker 容器,我用它来构建软件和生成共享库。我想在另一个 docker 容器中使用这些库来实际运行应用程序。为此,我使用带有已安装卷的构建 docker 在主机上拥有这些库。

我的 RUNTIME 容器的 docker 文件如下所示:

FROM openjdk:8

RUN apt update
ENV LD_LIBRARY_PATH /build/dist/lib
RUN ldconfig
WORKDIR /build

当我使用以下内容运行时:

docker run -u $(id -u ${USER}):$(id -g ${USER}) -it -v $(realpath .):/build runtime_docker bash

我在 ldconfig -p 缓存中没有看到 /build/dist/lib 中的任何库。

我做错了什么?

【问题讨论】:

  • 只有在容器运行时才读取来自主机的绑定挂载卷(当您使用 -v 标志时)。在运行ldconfig 的构建阶段,/build 将为空。这可能是问题吗?可能您可以将ldconfig 作为CMD 运行,它在实际安装卷时在运行时执行。抱歉,如果我误解了您的预期效果。

标签: docker ld


【解决方案1】:

你需要在RUN ldconfig之前将COPY的库放入镜像中;卷在这里对您没有帮助。

请记住,首先要运行 docker build 命令。这将运行 Dockerfile 中的所有命令,而无需安装任何卷。然后你拿那个图像和docker run 一个容器。卷装载仅在 docker run 发生时发生,但 RUN ldconfig 已经发生。

在您的 Dockerfile 中,您应该将文件 COPY 放入镜像中。没有特别的理由不使用“普通”系统目录,因为映像具有独立的文件系统。

FROM openjdk:8

# Copy shared-library dependencies in
COPY dist/lib/libsomething.so.1 /usr/lib
RUN ldconfig

# Copy the actual binary to run in and set it as the default container command
COPY dist/bin/something /usr/bin
CMD ["something"]

【讨论】:

  • 好的,这很有帮助,我遵循了。每次更新这些库以使该方案正常工作时,是否需要运行 docker build?编辑:需要明确的是,我之前曾考虑过这一点,但我想如果有办法使用docker run 做到这一点,当我编辑库文件时,我可以只使用docker run 第二个容器而无需重建它。似乎使用这种方法,我每次都需要重建容器以确保复制与更新 lib 文件一起发生。
  • 你确实需要重新运行docker build,就像你需要运行一些构建过程来创建.so文件和大概你的Java .jar文件一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2021-05-16
  • 2021-04-07
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多