libGL 错误:无法在 docker 容器中加载驱动程序 swrast

Posted

技术标签:

【中文标题】libGL 错误:无法在 docker 容器中加载驱动程序 swrast【英文标题】:libGL error: failed to load driver swrast in docker container 【发布时间】:2017-10-25 06:19:40 【问题描述】:

我有一个 docker 容器,我试图从中运行一个 pyqt 应用程序。除了 GUI 的一部分无法渲染外,一切都运行良好。码头工人日志把这个扔掉了:

libGL error: failed to load driver: swrast
X Error: GLXBadContext 169
 Extension:    154 (Uknown extension)
 Minor opcode: 6 (Unknown request)
 Resource id:  0x6400003
X Error: BadValue (integer parameter out of range for operation) 2
 Extension:    154 (Uknown extension)
 Minor opcode: 3 (Unknown request)
 Resource id:  0x0
...
QGLContext::makeCurrent(): Failed.

在我的 Dockerfile 中,我尝试安装了几乎所有我能找到的可能相关的包,包括 mesa-utils

就 docker-compose 文件而言,它是这样的:

version: '2'
    services:
    gui:
        build: .
        volumes:
        - .:/usr/src
        - /tmp/.X11-unix:/tmp/.X11-unix
        command: /bin/bash -c "python start.py"
        environment:
        - DISPLAY=unix$DISPLAY
        - QT_X11_NO_MITSHM=1
        devices:
        - "/dev/snd:/dev/snd"
        - "/dev/dri:/dev/dri"
        privileged: true

有什么我可能遗漏的想法吗?

【问题讨论】:

有趣的一个。我怀疑问题是内核可能没有它需要的驱动程序。我个人从未尝试让 docker 在 gui 环境中工作,所以这只是我的猜测。您是否确认主机内核已加载视频驱动程序? IIRC,swarst 是用于软件渲染的,这意味着它没有使用硬件 GPU。 【参考方案1】:

想通了。我必须构建具有硬件加速 OpenGL 支持的gui。有一个 repo (https://github.com/gklingler/docker3d) 包含带有 nvidia 或其他图形驱动程序支持的 docker 图像。

另一个问题是,除非主机和容器具有完全相同相同的驱动程序,否则它对我不起作用。为了解决这个问题,如果您在 linux 上运行,您可以运行以下 shell 脚本:

#!/bin/bash
version="$(glxinfo | grep "OpenGL version string" | rev | cut -d" " -f1 | rev)"
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/"$version"/NVIDIA-Linux-x86_64-"$version".run
mv NVIDIA-Linux-x86_64-"$version".run NVIDIA-DRIVER.run

【讨论】:

实际安装驱动运行:sudo ./NVIDIA-DRIVER.run -a -N --ui=none --no-kernel-module

以上是关于libGL 错误:无法在 docker 容器中加载驱动程序 swrast的主要内容,如果未能解决你的问题,请参考以下文章

在容器内运行 Chromium:libGl 错误

在开发容器和电子中加载共享库时出错

无法在本机反应中加载静态图像

无法在包中加载 NIB:'NSBundle 错误

在 .net 核心应用程序中加载标准库

出现“无法在捆绑包中加载 NIB”错误