【问题标题】:ParaView in Docker with OpenGL support支持 OpenGL 的 Docker 中的 ParaView
【发布时间】:2016-09-16 10:40:34
【问题描述】:

在我的系统上安装了各种软件包和程序(如 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 不熟悉,因此非常感谢任何帮助。

【问题讨论】:

    标签: opengl docker paraview


    【解决方案1】:

    您可以尝试以下步骤:

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

    那么你应该可以使用软件渲染的 OpenGL。

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

    在您的 github 存储库示例中,您使用主机显示: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 选项--ipc=host。根据 X 设置,还需要共享 ~/.Xauthority$XAUTHORITY,或者如果容器用户是 root,则在主机上设置 xhost +SI:localuser:root

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        相关资源
        最近更新 更多