docker - 在 docker 中使用 OpenGL 和 nvidia-docker2
问题描述
我正在尝试在 Ubuntu 16.04 容器中运行 OpenGL 应用程序 ( Gazebo ),并且我希望能够在可用时利用 nvidia 图形加速。我试图弄清楚推荐的、官方支持的(希望是由 nvidia 支持的)方法是什么。
我的要求:
- 创建图像非常耗时,因此我想为各种图形(nvidia、mesa 即其他所有图像)制作一个图像,或者如果分开,它们应该“从”一个通用的基础图像构建的内容。
- nvidia 容器应该在不同的系统上工作,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
- 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如,如果这只能在 18.04 上完成,我也会感兴趣。
到目前为止我已经尝试过:
- 只需为 nvidia 和其他所有内容构建单独的图像,使用
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
. 这很好用,但需要构建两个映像,这需要两倍的时间和两倍的磁盘空间。 打破要求1。 - 首先从 构建“普通”(台面/英特尔)映像
ubuntu:16.04
,在那里完成所有耗时的工作,然后将其用作另一个映像的基础,其中从官方“运行文件”手动安装 NVIDIA 驱动程序。如果驱动程序与主机上安装的驱动程序完全匹配,则此方法有效,但如果主机具有不同的(例如较旧的)版本,则此方法无效。打破要求2。 - 什么都不做,只需使用
--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=all
. 如果我这样做了,会nvidia-smi
看到卡,但 OpenGL(例如glxinfo
)仍然尝试加载swrast
驱动程序,但它不起作用。
我在野外看到的大多数示例都使用nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
基础,并且在我的一生中,我无法在该图像中找到如何安装 nvidia 驱动程序(如果有的话)。我还在某处读到,使用 nvidia 容器运行时(即nvidia-docker2
我正在使用的)您不需要安装驱动程序,但情况似乎并非如此,至少对于 OpenGL 而言并非如此。
再说一遍,有没有办法为满足我所有要求的 nvidia 和非 nvidia 创建容器映像,或者我只是想要太多?
解决方案
当您可以“窃取”别人的解决方案时,为什么还要浪费时间尝试自己找出解决方案呢?特别是如果其他人是 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 版本。
推荐阅读
- ubuntu - 有人可以告诉我如何在 lubuntu 上将 python 添加到我的路径环境变量中吗?
- reactjs - 仅使用来自另一个集合的 id 填充数据
- jquery - 幻灯片自动的问题:它对齐奇怪的元素
- python - 在python的未读邮件中从特定人那里获取附件
- mysql - MySQL 存储过程失败并出现错误 1064 (42000)
- amazon-web-services - 添加 EIP 后 EC2 公共 IPv4 变得无法访问
- laravel - Laravel:无法上传视频和图像文件
- java - 如何从没有实例名称的 main 中的另一个类调用 void 方法?
- google-cloud-platform - Informatica byol /IICS vs google data flow /data proc 需要的利弊
- vue.js - 如何使用 Nuxt 组件将参数传递给 vuex getter 方法?(同时保持三点符号)