c++ - 在 docker 容器中运行 Qt GUI

标签 c++ docker qt

所以,我有一个基于 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.
所以我搜索了如何做到这一点。我找到了 GUI Qt Application in a docker container ,并基于那个称之为
QT_GRAPHICSSYSTEM="native" docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix my_image
这导致了同样的错误。
然后我找到了Can you run GUI applications in a Docker container? .
那里接受的答案似乎特定于某些应用程序,例如 Firefox?
进一步向下滚动,我得到了一个解决方案,告诉我设置 X11UseLocalhost nosshd_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 的原因是让我的应用程序的用户可以轻松地运行它。

最佳答案

您有多个相互覆盖的错误。首先,确保您安装了正确的库。如果你的 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与 guest 用户的 HOME 目录。
高级图形(例如游戏、3D 建模等)可能还需要安装 /dev-v /dev:/dev .请注意,这将使 guest root 访问您的硬盘,因此您可能希望以更细粒度的方式复制/重新创 build 备。

关于c++ - 在 docker 容器中运行 Qt GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65642916/

相关文章:

c++ - 将 char* 转换为 int* C++

c# - 将一个数字更改为另一个数字所需的位

docker - 如何为 bbb(蓝色大按钮)编写 docker-compose 文件?

docker - 更新 docker 上的根证书

macos - 在 Mac OSX 上将 pkg-config 与 Qt Creator/qmake 一起使用

c++ - 如何准备 ActiveX 控件以通过 Web 交付

c++ - 符号 ":"在 C 和 C++ 中意味着什么?

linux - 在 dockerized mongodb 上找不到 mongodb 配置文件

c++ - Qt为多行文本绘制轮廓

c++ - Linux,我可以重定向外部库(.so)的调试输出吗