如何在 Wayland 下的容器中运行图形应用程序?

如何在 Wayland 下的容器中运行图形应用程序?

当我使用 X11 桌面时,我可以通过共享变量$DISPLAY/tmp/X11-unix目录在 docker 容器中运行图形应用程序。例如:

docker run -ti -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix some:ubuntu xclock

现在,我在运行 Wayland 的 Fedora 25 上,因此没有可与容器共享的 X11 基础设施。如何在容器中启动图形应用程序并将其显示在我的桌面上?有什么方法可以在 XWayland 中绑定吗?

答案1

正如您所说,您正在使用 Wayland 运行 Fedora 25,我假设您正在使用 Gnome-Wayland 桌面。

Gnome-Wayland 运行 Xwayland 来支持 X 应用程序。您可以分享克斯韦兰像之前使用 Xorg 一样进行访问。

您的示例命令未命中XAUTHORITY,并且您没有提及xhost。您需要其中一种方法来允许 docker 中的 X 应用程序访问 Xwayland(或任何 X)。由于这一切与 Wayland 无关,我指的是如何在 docker 容器中运行 GUI 应用程序?关于如何在 docker 中运行 X 应用程序。

简而言之,xhost 的两个解决方案:

  1. 允许本地用户通过 xhost 访问:xhost +SI:localuser:$(id -un)并使用 docker run 选项创建类似的用户:--user=$(id -u):$(id -g)
  2. 不鼓励:允许 root 访问 Xxhost +SI:localuser:root

有关的陷阱: X 通常使用共享内存(X 扩展名MIT-SHM)。 Docker 容器是隔离的,无法访问共享内存。这可能会导致渲染故障和 RAM 访问失败。您可以使用 docker run option 来避免这种情况--ipc=host。这会影响容器隔离,因为它会禁用 IPC 命名空间。比较:https://github.com/jessfraz/dockerfiles/issues/359


跑步韦兰在没有 X 的 docker 中运行应用程序,您需要一个正在运行的 Wayland 合成器,例如 Gnome-Wayland 或 Weston。您必须共享 Wayland 套接字。您可以在 中找到它XDG_RUNTIME_DIR,并且它的名称存储在 中WAYLAND_DISPLAY。由于XDG_RUNTIME_DIR只允许其所有者访问,因此容器中需要与主机上相同的用户。例子:

docker run -e XDG_RUNTIME_DIR=/tmp \
           -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
           -v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/tmp/$WAYLAND_DISPLAY  \
           --user=$(id -u):$(id -g) \
           imagename waylandapplication

QT5 应用程序还需要-e QT_QPA_PLATFORM=wayland并且必须启动imagename dbus-launch waylandapplication


x11docker适用于 docker 中的 X 和 Wayland 应用程序是一种多合一的解决方案。它还关心保持容器隔离(如果像您的示例一样简单地共享主机 X 显示,则会丢失)。

答案2

我推荐 Google 的 Sommelier。它允许您启动 Wayland 或 X11 应用程序,并提供这些应用程序正在寻找的套接字,以便将它们放入当前的显示服务器。 https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

这是一个简单的操作方法,适用于任何系统,而不仅仅是 ChromeOS 上的 Crouton/Crostini。

https://github.com/dnschneid/crouton/wiki/Sommelier-(A-more-native-alternative-to-xiwi)

相关内容