在 docker 和 nvidia-docker2 中使用 OpenGL
Using OpenGL inside docker with nvidia-docker2
我正在尝试 运行 OpenGL 应用程序 (Gazebo) 在 Ubuntu 16.04 容器中,我希望能够在以下情况下利用 nvidia 图形加速可用的。我试图弄清楚推荐的、官方支持的(希望是 nvidia)实现这一目标的方法是什么。
我的要求:
- 创建图像很耗时,所以我想为所有类型的图形(nvidia、mesa,即其他所有图形)制作一个图像,或者如果是单独的,则应该构建它们 "FROM"包含大部分内容的通用基础图像。
- nvidia 容器应该可以在不同的系统上运行,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
- 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如如果这只能在 18.04 完成,我也会感兴趣。
到目前为止我尝试过的:
- 只需使用
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
为 nvidia 和其他一切构建单独的图像。这很好用,但需要构建两个图像,这需要两倍的时间和两倍的磁盘 space。 违反要求 1.
- 首先从
ubuntu:16.04
构建 "normal" (mesa/intel) 映像,在那里完成所有耗时的工作,然后将其用作另一个包含 NVIDIA 驱动程序的映像的基础从官方 "run file" 手动安装。如果驱动程序与主机上安装的驱动程序完全匹配,则此方法有效,但如果主机具有不同的(例如旧版本)版本则无效。 违反要求 2。
- 什么都不做,只是 运行 我的常规 mesa 启用容器
--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 容器 运行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 版本。
我正在尝试 运行 OpenGL 应用程序 (Gazebo) 在 Ubuntu 16.04 容器中,我希望能够在以下情况下利用 nvidia 图形加速可用的。我试图弄清楚推荐的、官方支持的(希望是 nvidia)实现这一目标的方法是什么。
我的要求:
- 创建图像很耗时,所以我想为所有类型的图形(nvidia、mesa,即其他所有图形)制作一个图像,或者如果是单独的,则应该构建它们 "FROM"包含大部分内容的通用基础图像。
- nvidia 容器应该可以在不同的系统上运行,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
- 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如如果这只能在 18.04 完成,我也会感兴趣。
到目前为止我尝试过的:
- 只需使用
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04
为 nvidia 和其他一切构建单独的图像。这很好用,但需要构建两个图像,这需要两倍的时间和两倍的磁盘 space。 违反要求 1. - 首先从
ubuntu:16.04
构建 "normal" (mesa/intel) 映像,在那里完成所有耗时的工作,然后将其用作另一个包含 NVIDIA 驱动程序的映像的基础从官方 "run file" 手动安装。如果驱动程序与主机上安装的驱动程序完全匹配,则此方法有效,但如果主机具有不同的(例如旧版本)版本则无效。 违反要求 2。 - 什么都不做,只是 运行 我的常规 mesa 启用容器
--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 容器 运行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 版本。