支持OpenGL的Docker中的ParaView

t40tm48m  于 2022-11-04  发布在  Docker
关注(0)|答案(2)|浏览(242)

在我的系统上安装了各种软件包和程序,如vtk,tvtk,ParaView,mayavi,...之后,我最终得到了完全损坏的全局软件包。例如:目前我不能运行mayavi超过几秒钟,然后它崩溃没有任何消息。问题是,每个库需要不同版本的依赖关系(特别是Qt4与Qt5),你有时需要手动构建软件,以允许某些非标准的功能(ParaView与Python支持)等。结果是完全混乱。
因此,我决定在Docker中构建ParaView来隔离软件。我确实需要ParaView的Python脚本功能,这不是Ubuntu存储库包的默认选择。Here是我工作的结果。我受到this repository的启发,但也有一些缺点,特别是没有Python和MPI支持,它是官方ParaView存储库的一个分支。
所以,我使用它并创建了一个新的仓库。它是一个Ubuntu映像,包含所有必要的包,ParaView是通过MPI和Python支持构建的。请参阅README如何构建它以及如何运行它。如果有人感兴趣,我可以将映像推送到dockerhub。注意,主机上的用户需要有uid 1000,否则X服务器隧道将无法正常工作。不过,这个问题很容易解决。
因此,问题如下。当我运行ParaView时,我看到以下错误消息:

libGL error: failed to open drm device: No such file or directory
libGL error: failed to load driver: i965

显然,没有OpenGL加速。有人知道如何在docker中启用OpenGL支持吗?我知道this repository,但是我不喜欢通过vnc的解决方案。有没有其他方法可以做到这一点?我不熟悉OpenGL,所以任何帮助都是非常感谢的。

mi7gmzs6

mi7gmzs61#

您可以尝试以下步骤:

  • 在映像中安装mesa-utils
  • 将您的container用户添加到群组视频。

然后你应该能够使用软件渲染OpenGL。
从主机共享X unix套接字可能会有一些警告。你可以使用mviereck/x11docker在第二台X服务器上运行你的图像。软件渲染OpenGL工作正常。硬件渲染是实验性的,正在开发中。
在你的github存储库示例中,你使用了host display:0,共享$DISPLAY和unix套接字:

docker run -ti -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix paraview

如果你把dev/dri中的所有文件都共享给你的容器(尤其是/dev/dri/card0),很可能你会得到硬件加速。如果你得到一些渲染故障,你可以使用docker运行选项--ipc=host。根据X的设置,你也需要共享~/.Xauthority$XAUTHORITY,或者如果容器用户是root,在主机上设置xhost +SI:localuser:root

**注意:**此设置会破坏容器隔离!(要获得更好的隔离效果,请查看x11 docker。)

2jcobegt

2jcobegt2#

除了@mviereck建议的内容之外,在nvidia-docker容器上,我还需要执行docker run --privileged
显然,这不是一个理想的解决方案,但对于隔离不是主要问题的许多本地用例来说已经足够了。

CMD="${DOCKER} run --detach=true \                                                                                                                                                                                                                                                                                                                                           
                --privileged \                                                                                                                                                                                                                                                                                                                                               
                --group-add ${DOCKER_GROUP_ID} \                                                                                                                                                                                                                                                                                                                             
                --env HOME=${HOME_DIR} \                                                                                                                                                                                                                                                                                                                                     
                --env DISPLAY \                                                                                                                                                                                                                                                                                                                                              
                --interactive \                                                                                                                                                                                                                                                                                                                                              
                --name DevContainer \                                                                                                                                                                                                                                                                                                                                        
                --net=host \                                                                                                                                                                                                                                                                                                                                                 
                --rm \                                                                                                                                                                                                                                                                                                                                                       
                --tty \                                                                                                                                                                                                                                                                                                                                                      
                --user=${USER_ID}:${GROUP_ID} \                                                                                                                                                                                                                                                                                                                              
                --volume $HOME_DIR_HOST:${HOME_DIR} \                                                                                                                                                                                                                                                                                                                        
                --volume $WORK_DIR:${WORK_DIR} \                                                                                                                                                                                                                                                                                                                             
                --volume /tmp/.X11-unix:/tmp/.X11-unix \                                                                                                                                                                                                                                                                                                                     
                --volume /var/run/docker.sock:/var/run/docker.sock \                                                                                                                                                                                                                                                                                                         
                ${IDEA_IMAGE}"

这些选项中的许多选项对于OpenGL来说是多余的,但对于需要扩展访问的某些应用程序来说是有用的。
因为我使用的是nvidia docker container,所以$DOCKER实际上就是nvidia-docker。我还将主机用户添加到了video组,但我不确定这是否重要。

相关问题