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


15

当我使用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中有什么联系的方法吗?


不知道如何以正确的方式回答您的问题(我以前从未做过),但是在我的系统上,Wayland使用的unix域套接字在/run/user/1000/wayland-0我的个人桌面上。
布拉奇利'16

Answers:


16

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

Gnome-Wayland运行Xwayland以支持X应用程序。您可以像以前使用Xorg一样共享Xwayland访问权限。

您的示例命令未命中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. 不鼓励使用:允许通过 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应用程序,您需要一个正在运行的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


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


如果不确定我要运行的应用程序是X还是Wayland,该怎么办?有什么我可以传递的通用名称,以便它可以自动确定是否需要XWayland?
Oxwivi


1
@ShN可以在另一个Wayland合成器中将Weston作为客户端运行。在此客户端Weston中,您可以使用X应用程序运行Xwayland。使用x11docker:x11docker --weston-xwayland imagename application
mviereck

1
@Shn您也可以直接作为Wayland客户端运行Xwayland :Xwayland :20 & sleep 3 && docker run -e DISPLAY=:20 -v /tmp/.X11-unix:/tmp/.X11-unix imagename application。Xwayland将覆盖整个展览;您可以使用<Super> <LeftMouseButton>来移动它。随着x11docker: x11docker --xwayland imagename application
mviereck

1
@ShN无论如何都需要X服务器。为了避免在主机上使用X,我提供了x11docker / xwayland。如果有一天将其xpra移植到GTK3 + python3,它将通过无缝窗口提供进一步的可能性。Xvfb在容器中可能会进行不可见的设置。为了进行详细讨论,您可以在github上打开一个问题单
mviereck '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.