我正在尝试恢复一些旧代码,这些代码依赖于带有 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 转发
我必须对
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