如何将有关 GPU 的数据/信息(OpenGL、OpenCL、mesa 等版本)从主机传递到 dockerimagr?

Jag*_*rdo 4 opengl vmware gpu x11-forwarding docker

我目前正在运行 Ubuntu 16.04.2,这是一个相当新的安装,足以开始编程。我确实有一张 r9 390 AMD 卡,它的 AMD 驱动程序存在很多问题,但我认为这不是问题。

我使用以下代码片段创建了一个 dockerfile:

FROM ubuntu:16.04
.....
ENV DEBIAN_FRONTEND noninteractive  
RUN apt-get update && apt-get install -y --no-install-recommends apt-utils
WORKDIR /buildls
CMD ["bash"]
RUN apt-get install -y x11-apps
RUN apt-get install -y libcanberra-gtk*
RUN apt-get -y install libglfw3-dev
RUN apt-get -y install libglew-dev
RUN apt-get -y install mesa-utils
.......
Run Code Online (Sandbox Code Playgroud)

构建后,我运行它:

docker run -it                       `#container process` \
-v /tmp/.X11-unix:/tmp/.X11-unix `#Allows the X11 server to be shared (GUI)` \
-v $(pwd)/volume:/app            `#Shares a folder, one down in current directory (~/volume) with ROOT/app in the container` \
-e DISPLAY=$DISPLAY              `#Shares the display between the 2 systems` \
 opengl_why_you_no_work \
Run Code Online (Sandbox Code Playgroud)

我创建了一个简单的GL加载程序,使用GLFW和GLEW,我制作了2个版本来支持OpenGL 2.1(稍后你会看到原因)和3.2。在我编写的示例程序(带有一些调试输出调用)和

 glxinfo|grep OpenGL
Run Code Online (Sandbox Code Playgroud)

我收到一些有趣的问题。在我的主机上使用 glxinfo 调用,我得到

OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD HAWAII (DRM 2.46.0 / 4.8.0-58-generic, LLVM 3.8.0)
OpenGL core profile version string: 4.1 (Core Profile) Mesa 12.0.6
OpenGL core profile shading language version string: 4.10
OpenGL version string: 3.0 Mesa 12.0.6
OpenGL shading language version string: 1.30
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 12.0.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
Run Code Online (Sandbox Code Playgroud)

在泊坞窗图像上:

OpenGL vendor string: VMware, Inc.
OpenGL renderer string: Gallium 0.4 on llvmpipe (LLVM 3.8, 256 bits)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 12.0.6
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.0 Mesa 12.0.6
OpenGL shading language version string: 1.30
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 12.0.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
Run Code Online (Sandbox Code Playgroud)

嗯,供应商?因此,为 OpenGL 2.1 编写的程序使用:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
Run Code Online (Sandbox Code Playgroud)

在主机和docker上运行;简单的渲染...但它有效。即使它在 docker 图像上呈现,我仍然收到此错误:

libGL error: failed to open drm device: Permission denied
libGL error: failed to load driver: radeonsi
Run Code Online (Sandbox Code Playgroud)

如果我尝试在 docker 映像上运行为 OpenGL 3.2 制作的版本,我会得到没有渲染、没有窗口、上面相同的 2 个错误以及以下输出:

Renderer: (null)
OpenGL version supported (null)
Run Code Online (Sandbox Code Playgroud)

而不是 docker 镜像上的 2.1 版本:

Renderer: Gallium 0.4 on llvmpipe (LLVM 3.8, 256 bits)
OpenGL version supported 3.0 Mesa 12.0.6
Run Code Online (Sandbox Code Playgroud)

或在主机上运行任一版本的结果:

Renderer: Gallium 0.4 on AMD HAWAII (DRM 2.46.0 / 4.8.0-58-generic, LLVM 3.8.0)
OpenGL version supported 4.1 (Core Profile) Mesa 12.0.6
Run Code Online (Sandbox Code Playgroud)

因此,我假设它与供应商 X.org 与 VMware, Inc. 有关。我可以覆盖、直通、替换或以其他方式解决此问题吗?我或许可以为 OpenGL 3.0 编写代码(其中的乐趣在哪里?),但是一旦我的程序变得更加复杂,libGL 错误就会让我担心。此外,我想尝试使用 OpenCL,我确信我也会遇到类似的问题。

Jag*_*rdo 9

我找到了答案,但可能有些过头了……但它有效!

我在 Dockerfile 中添加了:

RUN apt-get install -y xserver-xorg-video-all
RUN apt-get update && apt-get install -y \
    libgl1-mesa-glx \
    libgl1-mesa-dri \
    && rm -rf /var/lib/apt/lists/*
....
RUN usermod -a -G video <username>
Run Code Online (Sandbox Code Playgroud)

但是,我认为台面文件已经存在,因为

FROM ubuntu:16.04
Run Code Online (Sandbox Code Playgroud)

线。我还补充道:

--device=/dev/dri:/dev/dri
Run Code Online (Sandbox Code Playgroud)

到脚本来运行 docker 镜像。有趣的是,当我进行故障排除时,我将 MESA 升级到最新版本(此处为 17.1 -> https://www.omgubuntu.co.uk/2017/05/mesa-17-1-ubuntu-ppa),现在我的主机上有 GL 4.5,映像上有 4.1 和 MESA 12.0.6...当然,现在我必须研究如何使其可以从 Windows/OS 主机上执行。

我使用了以下参考资料:

  • --device=/dev/dri:/dev/dri 添加这个解决了我的问题。谢谢。 (5认同)
  • 事实上,添加 `--device=/dev/dri:/dev/dri` 也为我解决了这个问题 (3认同)