8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Docker 容器中运行 Qt GUI

PriceOne 1月前

63 0

因此,我有一个基于 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 的首要原因是让我的应用程序用户能够轻松运行它。

帖子版权声明 1、本帖标题:在 Docker 容器中运行 Qt GUI
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由PriceOne在本站《docker》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 请详细解释每一行。例如什么是 osrf/ros:noetic-desktop-full

  • 有了英特尔的 CPU,对我有用的就是 --device=/dev/dri:/dev/dri 在 Keonik 的答案中添加以下内容:

    docker run -it \
                    -e "DISPLAY=$DISPLAY" \
                    -v /tmp/.X11-unix:/tmp/.X11-unix \
                    --device=/dev/dri:/dev/dri \
                    <image>
    

    文档 中也提到了这个选项 .

  • 那么 --network host 选项是否不必要?请参阅@phihag 的回答

  • JMag 1月前 0 只看Ta
    引用 5

    在主机系统上允许来自docker的X连接 xhost +local:root 并启动你的容器

    docker run -it \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       --name my_app \
       --rm \
       <your_image>
    
  • 您有多个相互覆盖的错误。首先,请确保安装了正确的库。如果您的 docker 镜像是基于 debian 的,它通常看起来像一行

    RUN apt-get update && \
        apt-get install -y libqt5gui5 && \
        rm -rf /var/lib/apt/lists/*
    ENV QT_DEBUG_PLUGINS=1
    

    注意环境变量 QT_DEBUG_PLUGINS 。这将使输出更有帮助,并引用任何缺失的库。在现在非常详细的输出中,查找类似以下内容:

    Cannot load library /usr/local/lib/python3.9/site-packages/PySide2/Qt/plugins/platforms/libqxcb.so: ( libxcb-icccm.so.4 : cannot open shared object file: No such file or directory)

    加粗的部分是缺少的库文件;您可以使用发行版的包管理器(例如 dpkg -S libxcb-iccm.so.4 在 debian 上)找到它所在的包。

    接下来,像这样启动 docker(可以是一行,为了清楚起见,各行分开):

    docker run \
      -e "DISPLAY=$DISPLAY" \
      -v "$HOME/.Xauthority:/root/.Xauthority:ro" \
      --network host \
       YOUR_APP_HERE
    

    确保 /root 用来宾用户的 HOME 目录进行替换。

    使用 /dev 进行安装 -v /dev:/dev 。请注意,这将使来宾获得对硬盘的 root 访问权限,因此您可能需要以更细粒度的方式复制/重新创建设备。

  • waq 1月前 0 只看Ta
    引用 7

    @DavidMaze 你知道有什么好的替代方案吗?最基本的是,我必须提供带有大量库文件的二进制文件。但谢谢你告诉我,我会重新考虑使用二进制文件。(我以前使用过 AppImage,但事实证明,对于我的工作来说,它相当混乱。)

  • 您无法在 Docker 中轻松运行 GUI 应用程序;您需要管理员级别的权限,并手动配置 X Window System 连接设置的几个细节。对于您的最终用户来说,本机二进制文件将更加容易。

返回
作者最近主题: