【问题标题】:Nvidia-docker - cant find libnvcuvid.so on building processNvidia-docker - 在构建过程中找不到 libnvcuvid.so
【发布时间】:2025-12-17 16:30:02
【问题描述】:

我编写了一个 Dockerfile 来构建我的 QT 应用程序,但我在构建时遇到了一些问题。

如果构建命令在 Dockerfile 上,则会出现此错误:

ninja: error: '/usr/lib/x86_64-linux-gnu/libnvcuvid.so', needed by 'bin/x64/release/*****/librtmpPlugin.so', missing and no known rule to make it

我添加了一个符号链接来解决临时容器上的这个错误:

ln -s /usr/local/nvidia/lib64/libnvcuvid.so.1 /usr/lib/x86_64-linux-gnu/libnvcuvid.so

但是当我添加该行并再次构建时,我仍然遇到同样的错误。

首先我认为这是因为悬挂图像的一些缓存但清理所有问题仍然存在。

这是我的一些 ENV 键:

ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64
ENV LIBRARY_PATH /usr/local/cuda/lib64/stubs:${LIBRARY_PATH}
ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV OPENCL_HEADERS /usr/local/cuda/include
ENV LIBOPENCL /usr/local/cuda/lib64
ENV CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda
ENV CUDA_NVCC_EXECUTABLE /usr/bin/nvcc

这是我为消除其他错误而采取的一些“技巧”:

RUN mv /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /usr/lib/x86_64-inux-gnu/libOpenCL.so.1_old
RUN ln -s /usr/local/cuda/lib64/libOpenCL.so.1 /usr/lib/x86_64-linux-gnu/libOpenCL.so.1
RUN ln -s /usr/local/cuda-8.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so
RUN ln -s /usr/local/cuda-8.0/targets/x86_64-linux/lib/stubs/libnvidia-ml.so /usr/lib/x86_64-linux-gnu/libnvidia-ml.so

我在最后一个版本 Docker 版本 17.03.1-ce 上使用 nvidia cuda 8 映像 + nvidia docker。

我认为 Dockerfile 编译过程和容器运行时之间没有任何区别。

【问题讨论】:

  • 有问题的库不是 CUDA 的一部分。它附带 NVIDIA 驱动程序

标签: docker nvidia nvidia-docker


【解决方案1】:

图像nvidia/cuda 与我的软件构建方案所需的nvidia drivers 不同,因此我必须安装与nividia-smi 输出显示的驱动器等效的驱动器。

apt-get install -y nvidia-381

我知道我将来可能会遇到一些问题,但这是你现在要走的路。

我还不得不重命名 libcuda.so,因为 nvidia-381 包有很多依赖项,并从 CUDA 包中删除了 libcuda.so,我开始收到很多警告。

RUN mv /usr/lib/x86_64-linux-gnu/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so_old
RUN ln -s /usr/local/cuda-8.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so

【讨论】:

  • 这是nvidia-docker 的一个非常强烈的禁忌。 nvidia-docker 的全部意义在于,您不必在 docker 映像或 dockerfile 中安装驱动程序。如果您仍然这样做,您将破坏nvidia-docker 带来的灵活性,请参阅here 了解另一种方法。