Wie kann ich eine grafische Anwendung in einem Container unter Wayland ausführen?


15

Wenn ich einen X11-Desktop verwendete, konnte ich grafische Anwendungen in Docker-Containern ausführen, indem ich die $DISPLAYVariable und das /tmp/X11-unixVerzeichnis gemeinsam nutzte . Beispielsweise:

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

Jetzt bin ich auf Fedora 25 und leite Wayland. Es gibt also keine X11-Infrastruktur, die ich mit dem Container teilen könnte. Wie kann ich eine grafische Anwendung im Container starten und auf meinem Desktop anzeigen lassen? Gibt es eine Möglichkeit, in XWayland zu binden?


Ich bin mir nicht sicher, wie ich deine Frage richtig beantworten soll (das habe ich noch nie gemacht), aber auf meinem System befindet sich der von Wayland verwendete Unix-Domain-Socket auf /run/user/1000/wayland-0meinem persönlichen Desktop.
Bratchley

Antworten:


16

Ich gehe davon aus, dass Sie den Gnome-Wayland-Desktop verwenden, da Sie Fedora 25 mit Wayland verwenden.

Gnome-Wayland führt Xwayland aus, um X-Anwendungen zu unterstützen. Sie können den Xwayland- Zugang wie zuvor mit Xorg teilen .

Ihr Beispielbefehl fehlt XAUTHORITYund Sie erwähnen nicht xhost. Sie benötigen eine dieser Möglichkeiten, um X-Anwendungen in Docker den Zugriff auf Xwayland (oder ein beliebiges X) zu ermöglichen. Da dies alles nicht mit Wayland zu tun hat, verweise ich auf Wie können Sie GUI-Anwendungen im Docker-Container ausführen? zum Ausführen von X-Anwendungen im Docker.

Kurz gesagt, zwei Lösungen mit xhost:

  1. Ermöglichen Sie Ihrem lokalen Benutzer den Zugriff über xhost: xhost +SI:localuser:$(id -un)und erstellen Sie einen ähnlichen Benutzer mit der Docker-Ausführungsoption:--user=$(id -u):$(id -g)
  2. Entmutigt: Erlaube root Zugriff auf X mit xhost +SI:localuser:root

Verwandte Fallstricke : X verwendet normalerweise den gemeinsamen Speicher (X-Erweiterung MIT-SHM). Docker-Container sind isoliert und können nicht auf den gemeinsam genutzten Speicher zugreifen. Dies kann zu Störungen beim Rendern und RAM-Zugriffsfehlern führen. Mit der Docker-Ausführungsoption können Sie dies vermeiden --ipc=host. Dies wirkt sich auf die Containerisolierung aus, da der IPC-Namespace deaktiviert wird. Vergleiche: https://github.com/jessfraz/dockerfiles/issues/359


Um Wayland- Anwendungen in Docker ohne X auszuführen, benötigen Sie einen Wayland-Compositor wie Gnome-Wayland oder Weston. Sie müssen den Wayland-Sockel teilen. Sie finden es in XDG_RUNTIME_DIRund sein Name wird in gespeichert WAYLAND_DISPLAY. Da XDG_RUNTIME_DIRder Zugriff nur seinem Besitzer gestattet ist, benötigen Sie denselben Benutzer im Container wie auf dem Host. Beispiel:

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-Anwendungen -e QT_QPA_PLATFORM=waylandmüssen ebenfalls gestartet werdenimagename dbus-launch waylandapplication


x11docker für X- und Wayland-Anwendungen in Docker ist eine Komplettlösung . Es ist auch wichtig, die Containerisolation beizubehalten (dies geht verloren, wenn Sie einfach die Host-X-Anzeige wie in Ihrem Beispiel freigeben).


Was ist, wenn ich nicht sicher bin, ob die App, die ich ausführen möchte, X oder Wayland ist? Kann ich irgendetwas generisches übergeben, um automatisch festzustellen, ob XWayland benötigt wird oder nicht?
Oxwivi


1
@ShN Es ist möglich, Weston als Client in einem anderen Wayland-Compositor auszuführen. In diesem Client Weston können Sie Xwayland mit X-Anwendungen ausführen. Mit x11docker:x11docker --weston-xwayland imagename application
mviereck

1
@Shn Sie können auch Xwayland direkt als Wayland - Client ausführen: Xwayland :20 & sleep 3 && docker run -e DISPLAY=:20 -v /tmp/.X11-unix:/tmp/.X11-unix imagename application. Xwayland deckt das gesamte Display ab. Sie können es mit <Super> <LeftMouseButton> verschieben. Mit x11docker: x11docker --xwayland imagename application.
Mviereck

1
@ShN Du brauchst auf jeden Fall einen X-Server. Um X auf dem Host zu vermeiden, biete ich x11docker / xwayland an . Wenn xpraes eines Tages auf GTK3 + python3 portiert wird, bietet es weitere Möglichkeiten mit nahtlosen Fenstern. Unsichtbare Einstellungen sind mit Xvfbin container möglich. Zur ausführlichen Diskussion können Sie bei github ein Issue Ticket eröffnen .
Mviereck

0

Ich würde Sommelier von Google empfehlen. Sie können damit Wayland OR X11-Apps starten und die Sockets bereitstellen, nach denen diese Apps suchen, um sie auf den aktuellen Anzeigeserver zu übertragen. https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

Eine einfache Anleitung sollte auf jedem System funktionieren, nicht nur auf Crouton / Crostini unter ChromeOS.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.