![如何在 Wayland 下的容器中运行图形应用程序?](https://linux22.com/image/100893/%E5%A6%82%E4%BD%95%E5%9C%A8%20Wayland%20%E4%B8%8B%E7%9A%84%E5%AE%B9%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%9B%BE%E5%BD%A2%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
当我使用 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 的两个解决方案:
- 允许本地用户通过 xhost 访问:
xhost +SI:localuser:$(id -un)
并使用 docker run 选项创建类似的用户:--user=$(id -u):$(id -g)
- 不鼓励:允许 root 访问 X
xhost +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)