Answers:
正如您说的那样,您在Wayland上运行Fedora 25,我假设您正在使用Gnome-Wayland桌面。
Gnome-Wayland运行Xwayland以支持X应用程序。您可以像以前使用Xorg一样共享Xwayland访问权限。
您的示例命令未命中XAUTHORITY
,您未提及xhost
。您需要使用以下一种方式来允许Docker中的X应用程序访问Xwayland(或任何X)。由于所有这些都与Wayland不相关,因此请参阅如何在Docker容器中运行GUI应用程序?关于如何在docker中运行X应用程序的信息。
简而言之,使用xhost的两种解决方案:
xhost +SI:localuser:$(id -un)
并使用docker run选项创建一个类似的用户:--user=$(id -u):$(id -g)
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显示,则会丢失容器隔离)。
x11docker --weston-xwayland imagename application
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
。
xpra
移植到GTK3 + python3,它将通过无缝窗口提供进一步的可能性。Xvfb
在容器中可能会进行不可见的设置。为了进行详细讨论,您可以在github上打开一个问题单。
我会推荐Google的侍酒师。它允许您启动Wayland OR 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)
/run/user/1000/wayland-0
我的个人桌面上。