首页 > 解决方案 > 在 docker 中使用 OpenGL 和 nvidia-docker2

问题描述

我正在尝试在 Ubuntu 16.04 容器中运行 OpenGL 应用程序 ( Gazebo ),并且我希望能够在可用时利用 nvidia 图形加速。我试图弄清楚推荐的、官方支持的(希望是由 nvidia 支持的)方法是什么。

我的要求:

  1. 创建图像非常耗时,因此我想为各种图形(nvidia、mesa 即其他所有图像)制作一个图像,或者如果分开,它们应该“从”一个通用的基础图像构建的内容。
  2. nvidia 容器应该在不同的系统上工作,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
  3. 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如,如果这只能在 18.04 上完成,我也会感兴趣。

到目前为止我已经尝试过:

我在野外看到的大多数示例都使用nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04基础,并且在我的一生中,我无法在该图像中找到如何安装 nvidia 驱动程序(如果有的话)。我还在某处读到,使用 nvidia 容器运行时(即nvidia-docker2我正在使用的)您不需要安装驱动程序,但情况似乎并非如此,至少对于 OpenGL 而言并非如此。

再说一遍,有没有办法为满足我所有要求的 nvidia 和非 nvidia 创建容器映像,或者我只是想要太多?

标签: dockerubuntuopenglnvidia

解决方案


当您可以“窃取”别人的解决方案时,为什么还要浪费时间尝试自己找出解决方案呢?特别是如果其他人是 NVIDIA 自己。

由于nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04似乎运行良好,但将其用作基本中断要求 1,我可以将文件从中复制并复制到我的图像中。

这里${from}指向我原始的、不支持 nvidia 的容器映像(但我也用 测试了它from=ubuntu:16.04),我只是将 nvidia 的驱动程序和配置复制过来:

ARG from
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04 as nvidia
FROM ${from}

COPY --from=nvidia /usr/local /usr/local
COPY --from=nvidia /etc/ld.so.conf.d/glvnd.conf /etc/ld.so.conf.d/glvnd.conf

ENV NVIDIA_VISIBLE_DEVICES=all NVIDIA_DRIVER_CAPABILITIES=all

有了这个,加上我在 .glxinfo${from}之上构建的ubuntu:16.04,glxinfo 返回了预期的配置(NVIDIA 是 GL 供应商),我可以像在主机上一样运行 Gazebo、Blender 等。这样做的美妙之处在于,即使不使用 nvidia 运行时,在没有 nvidia 驱动程序的系统上,生成的容器也能正常工作,它只是优雅地回退到使用 Mesa(我猜这就是“glvnd”所做的)。

虽然我目前需要使用 Ubuntu 16.04,但我看不出为什么类似的方法不适用于其他 Ubuntu 版本。


推荐阅读