Comment puis-je exécuter une application graphique dans un conteneur sous Wayland?

15

Lorsque j'utilisais un bureau X11, je pouvais exécuter des applications graphiques dans des conteneurs Docker en partageant la $DISPLAYvariable et le /tmp/X11-unixrépertoire. Par exemple:

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

Maintenant, je suis sur Fedora 25 exécutant Wayland, il n'y a donc pas d'infrastructure X11 à partager avec le conteneur. Comment puis-je lancer une application graphique dans le conteneur et la faire apparaître sur mon bureau? Existe-t-il un moyen de lier XWayland?

Willi Ballenthin
la source
Je ne sais pas comment répondre correctement à votre question (je ne l'ai jamais fait auparavant) mais sur mon système, la prise de domaine Unix utilisée par Wayland est /run/user/1000/wayland-0pour mon bureau personnel.
Bratchley

Réponses:

16

Comme vous dites que vous utilisez Fedora 25 avec Wayland, je suppose que vous utilisez le bureau Gnome-Wayland.

Gnome-Wayland exécute Xwayland pour prendre en charge les applications X. Vous pouvez partager l' accès à Xwayland comme vous l'avez fait auparavant avec Xorg.

Votre exemple de commande manque XAUTHORITY, et vous ne le mentionnez pas xhost. Vous avez besoin de l'une de ces façons pour autoriser les applications X dans Docker à accéder à Xwayland (ou à n'importe quel X). Comme tout cela n'est pas lié à Wayland, je me réfère à Comment pouvez-vous exécuter des applications GUI dans un conteneur Docker? sur la façon d'exécuter des applications X dans Docker.

Pour faire court, deux solutions avec xhost:

  1. Autorisez l'accès de votre utilisateur local via xhost: xhost +SI:localuser:$(id -un)et créez un utilisateur similaire avec l'option runer docker:--user=$(id -u):$(id -g)
  2. Découragé: Autorisez l'accès root à X avec xhost +SI:localuser:root

Piège connexe : X utilise normalement la mémoire partagée (extension X MIT-SHM). Les conteneurs Docker sont isolés et ne peuvent pas accéder à la mémoire partagée. Cela peut entraîner des problèmes de rendu et des échecs d'accès à la RAM. Vous pouvez éviter cela avec l'option runer docker --ipc=host. Cela affecte l'isolement du conteneur car il désactive l'espace de noms IPC. Comparez: https://github.com/jessfraz/dockerfiles/issues/359


Pour exécuter des applications Wayland dans Docker sans X, vous avez besoin d'un compositeur Wayland en cours d'exécution comme Gnome-Wayland ou Weston. Vous devez partager la prise Wayland. Vous le trouvez dans XDG_RUNTIME_DIRet son nom est stocké dans WAYLAND_DISPLAY. Comme XDG_RUNTIME_DIRne permet l'accès que pour son propriétaire, vous avez besoin du même utilisateur dans le conteneur que sur l'hôte. Exemple:

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

Les applications QT5 ont également besoin -e QT_QPA_PLATFORM=waylandet doivent être démarrées avecimagename dbus-launch waylandapplication


x11docker pour les applications X et Wayland dans docker est une solution tout en un. Il se soucie également de préserver l'isolement du conteneur (qui se perd si vous partagez simplement l'affichage de l'hôte X comme dans votre exemple).

mviereck
la source
Que faire si je ne suis pas sûr que l'application que je souhaite exécuter soit X ou Wayland? Y a-t-il quelque chose de générique que je peux passer pour qu'il puisse déterminer automatiquement si XWayland est nécessaire ou non?
Oxwivi
1
@ShN Il est possible d'exécuter Weston en tant que client dans un autre compositeur Wayland. Dans ce client Weston, vous pouvez exécuter Xwayland avec des applications X. Avec x11docker:x11docker --weston-xwayland imagename application
mviereck
1
@Shn vous pouvez également exécuter Xwayland directement en tant que client Wayland: Xwayland :20 & sleep 3 && docker run -e DISPLAY=:20 -v /tmp/.X11-unix:/tmp/.X11-unix imagename application. Xwayland couvrira l'ensemble de l'affichage; vous pouvez le déplacer avec <Super> <LeftMouseButton>. Avec x11docker: x11docker --xwayland imagename application.
mviereck
1
@ShN Vous avez besoin d'un serveur X dans tous les cas. Pour éviter X sur l'hôte, je fournis x11docker / xwayland . Si xpraest porté un jour sur GTK3 + python3 , il offrira d'autres possibilités avec des fenêtres transparentes. Des configurations invisibles sont possibles avec Xvfben conteneur. Pour une discussion détaillée, vous pouvez ouvrir un ticket d'émission sur github .
mviereck
0

Je recommanderais Sommelier by Google. Il vous permet de lancer les applications Wayland OR X11 et fournit les sockets que ces applications recherchent afin de les intégrer au serveur d'affichage actuel. https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

Un mode d'emploi simple qui devrait fonctionner sur n'importe quel système, pas seulement Crouton / Crostini sur ChromeOS.

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

dragon788
la source