通过 ssh 在 docker 容器中使用 GLFW

问题描述 投票:0回答:1

我正在尝试恢复一些旧代码,这些代码依赖于带有 GLFW 的脚本。

脚本源代码可以查看这里

问题是,我需要在 nvidia docker 容器 (nvcr.io/nvidia/tensorrt:21.06-py3) 内运行它,该容器部署在服务器上,没有任何 Display 连接到它。像往常一样,访问服务器的唯一方法是 ssh 连接。

调用脚本时我一直遇到同样的异常:

EXCEPTION: GLFW initialization failed.
,这是

的结果
 if (glfwInit() != GLFW_TRUE) { 
    throw std::runtime_error("GLFW initialization failed."); 
}

调用

glfwGetError(&description)
会导致

X11: Failed to open display unix:0

问题是 - 服务器上的 $DISPLAY 没有默认值。

我尝试通过

export DISPLAY=:0
在主机上手动设置它,然后与正在运行的容器共享主机x11套接字:

docker run --gpus all -e DISPLAY=unix$DISPLAY -it --rm --shm-size 1G  \
        -v /tmp/.X11-unix:/tmp/.x11-unix \
        <image>

使用x11转发连接到服务器后(

ssh -X bla@bla
)

但这并没有解决问题

所以我的问题基本上是 - 我怎样才能让它发挥作用?我应该使用一些特殊选项重新编译 GLFW,这样它就可以在不设置 $DISPLAY 的情况下工作。或者也许有办法在 docker 容器中调用模拟显示?

我真的需要这个脚本独立工作,即没有任何活动的 ssh 连接,因此没有任何 x11 转发

c++ docker ubuntu ssh glfw
1个回答
0
投票

我必须对

facewarp.cpp
进行一些小调整才能构建它:添加
#include <stdexcept>

或者也许有办法在docker容器中调用模拟显示?

是的,有:使用帧缓冲区 (

xvfb
) 来模拟 X11。

🗎

Dockerfile

FROM nvcr.io/nvidia/tensorrt:21.06-py3

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -q && \
    apt-get install -y -qq \
        g++ \
        libglfw3-dev \
        libstb-dev \
        xvfb

COPY facewarp.cpp .
RUN g++ -I/usr/include/stb/ facewarp.cpp -lGL -lglfw -o facewarp

ENV DISPLAY=:99

ENTRYPOINT []
CMD Xvfb :99 -screen 0 1024x768x16 & ./facewarp

© www.soinside.com 2019 - 2024. All rights reserved.