支持OpenGL的Docker中的ParaView

时间:2016-09-16 10:40:34

标签: opengl docker paraview

在我的系统上安装各种软件包和程序,如vtk,tvtk,ParaView,mayavi,...后,我最终得到了完全破碎的全局软件包。例如:目前我无法运行mayavi超过几秒钟,而不是在没有任何消息的情况下崩溃。问题是每个库都需要不同版本的依赖(特别是Qt4与Qt5),您有时需要手动构建软件以允许某些非标准功能(支持Python的ParaView)等等。结果是一团糟。

因此,我决定在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存储库,但我不喜欢通过vnc解决方案。有没有其他方法如何做同样的事情?我对OpenGL并不熟悉,所以非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以尝试以下步骤:

  • 在图片中安装mesa-utils
  • 将您的容器用户添加到群组视频。

然后你应该可以使用渲染的OpenGL软件。

从主机共享X unix套接字可能有一些注意事项。您可以使用mviereck/x11docker在第二台X服务器上运行映像。软件渲染OpenGL工作正常。硬件渲染是实验性的,并且正在开发中。

在您的github repo示例中,您正在使用主机显示:0,共享$DISPLAY和unix套接字:

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

如果您使用容器(尤其是dev/dri)共享/dev/dri/card0中的所有文件,则很可能会获得硬件加速。如果出现一些渲染故障,可以使用docker run option --ipc=host。根据X设置,如果容器用户是root用户,则还需要共享~/.Xauthority$XAUTHORITY,或者在主机上设置xhost +SI:localuser:root

注意:此设置会破坏容器隔离! (为了更好的隔离,请查看x11docker。)

答案 1 :(得分:1)

除了@mviereck提出的,在nvidia-docker容器上,我还需要docker run --privileged。我的整个docker run命令看起来像:

显然,这不是一个理想的解决方案,但对于许多本地使用情况来说已经足够了,因为隔离并不是主要问题。

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组,但我不确定这是否重要。