安装 nvidia 后,docker 中的凉亭和 rviz 停止工作

Posted

技术标签:

【中文标题】安装 nvidia 后,docker 中的凉亭和 rviz 停止工作【英文标题】:gazebo and rviz in docker stopped working after installing nvidia 【发布时间】:2021-05-19 18:06:12 【问题描述】:

长话短说:我有一个工作的 docker 图像,我可以通过 Xserver 显示图形化的东西。我对其进行了多次测试,一切似乎都完美无缺。然而,在安装 Nvidia 和 CUDA 后,我开始收到此错误:

Error setting socket option (IP_ADD_MEMBERSHIP).
Error setting socket option (IP_ADD_MEMBERSHIP).
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  151 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  38
  Current serial number in output stream:  37
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  151 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  38
  Current serial number in output stream:  37

因为我需要 CUDA 来完成另一个项目,所以我不能直接卸载它。目前我正在运行这些命令:

docker build -t $container_name $repo_DIR/.
docker run -it -d --net=host --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --name=$container_name -v $HOME/repos/$container_name/src/:"/home/docker/catkin_ws/src_extern/" --gpus all $container_name bash
xhost +local:"docker inspect --format=' .Config.Hostname ' $container_name" 
docker start $container_name 
docker exec --user docker -it $container_name bash

我尝试了来自论坛的不同方法,但我找不到任何有效的方法或任何与我的确切问题相关的帖子。有什么建议?如果可能的话,它也应该能够在没有 cuda/nvidia 的情况下运行,因为我也需要笔记本电脑的图像。如果它在 cuda/nvidia 上工作也很好,因为无论如何我不需要它用于 docker 映像。

其他一些信息 我正在使用 Arch 和 CUDA-10.2nvidia-460 驱动程序。 docker 镜像在ubuntu:bionic 上运行,这些是包括 libGL 在内的所有文件:

/usr/lib/x86_64-linux-gnu/libGLESv1_CM.so.1
/usr/lib/x86_64-linux-gnu/libGLESv2.so
/usr/lib/x86_64-linux-gnu/libGLX_indirect.so.0
/usr/lib/x86_64-linux-gnu/libGLU.so.1.3.1
/usr/lib/x86_64-linux-gnu/libGLESv2.so.2
/usr/lib/x86_64-linux-gnu/libGLU.so.1
/usr/lib/x86_64-linux-gnu/libGLU.so
/usr/lib/x86_64-linux-gnu/libGL.so
/usr/lib/x86_64-linux-gnu/libGLU.a
/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0
/usr/lib/x86_64-linux-gnu/libGLX.so
/usr/lib/x86_64-linux-gnu/libGL.so.1
/usr/lib/x86_64-linux-gnu/libGL.so.1.0.0
/usr/lib/x86_64-linux-gnu/libGLdispatch.so
/usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0
/usr/lib/x86_64-linux-gnu/libGLX.so.0
/usr/lib/x86_64-linux-gnu/libGLdispatch.so.0.0.0
/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0.0.0
/usr/lib/x86_64-linux-gnu/libGLESv1_CM.so.1.0.0
/usr/lib/x86_64-linux-gnu/libGLESv1_CM.so
/usr/lib/x86_64-linux-gnu/libGLdispatch.so.0
/usr/lib/x86_64-linux-gnu/libGLESv2.so.2.0.0

编辑1:解决方案,显然只有rviz和gazebo坏了,通过关注this

修复了

编辑 2:更改为更相关的标题。

【问题讨论】:

您的$DISPLAY 的内容是什么/如何/如何从容器访问Xserver?它必须通过从容器到 Xserver 的网络连接 - 即 Xserver 必须配置为侦听网络端口,这不是默认的 - 或者通过必须绑定的 unix 套接字建立连接 -安装到容器中 - 这里不是这种情况。所以我不太明白这首先是如何工作的。你有什么改变吗? 是的,在安装 nvidia 之前一切正常,但我找到了解决方案,我会将其添加到我的问题中。 【参考方案1】:

安装nvidia后只有gazebo和rviz坏了。我通过关注this 修复了它。我在 dockerfile 中错过的部分是:

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES \
    $NVIDIA_VISIBLE_DEVICES:-all
ENV NVIDIA_DRIVER_CAPABILITIES \
    $NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,graphics

【讨论】:

以上是关于安装 nvidia 后,docker 中的凉亭和 rviz 停止工作的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow:在Linux上安装nvidia-docker环境,解决显卡切换问题,只需要几步就可以成功安装,安装之后登陆不了界面,只能变成服务器模式命令后执行了。

安装 Docker 和 nvidia-docker2

安装 Docker 和 nvidia-docker2

安装使用NVIDIA-Docker-- 可使用GPU的Docker容器

[Notes] Ubuntu安装nvidia-docker2

centos7 安装 NVIDIA Docker