因此,我有一个基于 Qt5 的 C++ GUI,我想从 Docker 容器内部运行它。当我尝试使用docker run --rm -it my_image启动它时,这会导致错误输出qt.qpa.xcb:无法
所以,我有一个基于 Qt5 的 C++ GUI,我想从 Docker 容器内部运行它。
当我尝试开始
docker run --rm -it my_image
这会导致错误输出
qt.qpa.xcb: could not connect to display localhost:10.0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
所以我搜索了如何做到这一点。我 在docker容器中找到了GUI Qt应用程序 ,并以此为基础调用它
QT_GRAPHICSSYSTEM="native" docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix my_image
这导致了同样的错误。
然后我发现 你能在 Docker 容器中运行 GUI 应用程序吗? .
其中接受的答案似乎特定于某些应用程序,例如 Firefox?
向下滚动我得到了一个解决方案,告诉我设置 X11UseLocalhost no
in sshd_config
调用它
docker run -v $HOME:/hosthome:ro -e XAUTHORITY=/hosthome/.Xauthority -e DISPLAY=$(echo $DISPLAY | sed "s/^.*:/$(hostname -i):/") my_image
这会产生与上述错误略有不同之处:
qt.qpa.xcb: could not connect to display 127.0.1.1:13.0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
根据另一个答案,我将其添加 ENV DISPLAY :0
到我的 Dockerfile 中并用
xhost +
XSOCK=/tmp/.X11-unix/X0
docker run -v $XSOCK:$XSOCK my_image
这次,我的错误的第一行是 qt.qpa.xcb: could not connect to display :0
.
然后我尝试了另一个答案,补充道
RUN export uid=0 gid=0 && \
mkdir -p /home/developer && \
echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
echo "developer:x:${uid}:" >> /etc/group && \
mkdir /etc/sudoers.d/ && \
echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
chmod 0440 /etc/sudoers.d/developer && \
chown ${uid}:${gid} -R /home/developer
到我的Dockerfile并调用 docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix my_image
,再次出现同样的错误。
中描述的几种方法 http://wiki.ros.org/docker/Tutorials/GUI ,但出现同样的错误。
我做错了什么吗?请注意,我正在通过 SSH 在远程计算机上工作,当然,X11 转发已打开(并且应用程序在 Docker 之外运行良好)。另请注意,我编写的是客户端-服务器应用程序,服务器部分不需要 GUI 元素但共享大部分源代码,因此可以在其容器中正常运行。
我希望找到一个不需要我改变系统的解决方案,因为我使用 Docker 的首要原因是让我的应用程序用户能够轻松运行它。