在 docker 和 nvidia-docker2 中使用 OpenGL

Using OpenGL inside docker with nvidia-docker2

我正在尝试 运行 OpenGL 应用程序 (Gazebo) 在 Ubuntu 16.04 容器中,我希望能够在以下情况下利用 nvidia 图形加速可用的。我试图弄清楚推荐的、官方支持的(希望是 nvidia)实现这一目标的方法是什么。

我的要求:

  1. 创建图像很耗时,所以我想为所有类型的图形(nvidia、mesa,即其他所有图形)制作一个图像,或者如果是单独的,则应该构建它们 "FROM"包含大部分内容的通用基础图像。
  2. nvidia 容器应该可以在不同的系统上运行,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
  3. 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如如果这只能在 18.04 完成,我也会感兴趣。

到目前为止我尝试过的:

我在野外看到的大多数示例都使用 nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04 基础,而对于我来说,我无法在该图像中找到 nvidia 驱动程序的安装方式(如果有的话)。我还在某处读到,使用 nvidia 容器 运行time(即我正在使用的 nvidia-docker2)你不需要安装驱动程序,但这似乎不是情况下,至少对于 OpenGL 不是。

那么,有没有一种方法可以为 nvidia 和非 nvidia 创建满足我所有要求的容器映像,或者我只是想要太多?

既然您只能 "steal" 别人的解决方案,为什么还要浪费时间自己找出解决方案?特别是如果其他人是 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

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

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