¿Cómo puedo ejecutar una aplicación gráfica en un contenedor en Wayland?


15

Cuando utilicé un escritorio X11, pude ejecutar aplicaciones gráficas en contenedores acoplables compartiendo la $DISPLAYvariable y el /tmp/X11-unixdirectorio. Por ejemplo:

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

Ahora, estoy en Fedora 25 con Wayland, así que no hay infraestructura X11 para compartir con el contenedor. ¿Cómo puedo iniciar una aplicación gráfica en el contenedor y hacer que aparezca en mi escritorio? ¿Hay alguna forma de empatar en XWayland?


No estoy seguro de cómo responder a su pregunta de la manera correcta (nunca lo he hecho antes), pero en mi sistema el socket de dominio Unix utilizado por Wayland está en /run/user/1000/wayland-0mi escritorio personal.
Bratchley

Respuestas:


16

Como usted dice que está ejecutando Fedora 25 con Wayland, supongo que está utilizando el escritorio Gnome-Wayland.

Gnome-Wayland ejecuta Xwayland para admitir aplicaciones X. Puede compartir el acceso a Xwayland como lo hizo antes con Xorg.

Su comando de ejemplo falla XAUTHORITYy no lo menciona xhost. Necesita una de estas formas para permitir que las aplicaciones X en Docker accedan a Xwayland (o cualquier X). Como todo esto no está relacionado con Wayland, me refiero a ¿Cómo puede ejecutar aplicaciones GUI en el contenedor docker? sobre cómo ejecutar aplicaciones X en Docker.

En resumen, dos soluciones con xhost:

  1. Permita que su usuario local acceda a través de xhost: xhost +SI:localuser:$(id -un)y cree un usuario similar con la opción de ejecución de Docker:--user=$(id -u):$(id -g)
  2. Desalentado: permitir el acceso de root a X con xhost +SI:localuser:root

Problemas relacionados : X normalmente usa memoria compartida (extensión X MIT-SHM). Los contenedores Docker están aislados y no pueden acceder a la memoria compartida. Eso puede conducir a fallas de renderizado y fallas de acceso a RAM. Puede evitar eso con la opción de ejecución de Docker--ipc=host . Eso afecta el aislamiento del contenedor ya que deshabilita el espacio de nombres IPC. Comparar: https://github.com/jessfraz/dockerfiles/issues/359


Para ejecutar aplicaciones Wayland en Docker sin X, necesita un compositor de wayland en ejecución como Gnome-Wayland o Weston. Tienes que compartir el zócalo Wayland. Lo encuentras en XDG_RUNTIME_DIRy su nombre se almacena en WAYLAND_DISPLAY. Como XDG_RUNTIME_DIRsolo permite el acceso a su propietario, necesita el mismo usuario en el contenedor que en el host. Ejemplo:

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

Las aplicaciones QT5 también necesitan -e QT_QPA_PLATFORM=wayland y deben iniciarse conimagename dbus-launch waylandapplication


x11docker para aplicaciones X y Wayland en docker es una solución todo en uno. También se preocupa por preservar el aislamiento del contenedor (que se pierde si simplemente comparte la pantalla X del host como en su ejemplo).


¿Qué sucede si no estoy seguro de si la aplicación que quiero ejecutar es X o Wayland? ¿Hay algo genérico que pueda pasar para que pueda determinar automáticamente si se necesita XWayland o no?
Oxwivi


1
@ShN Es posible ejecutar Weston como cliente en otro compositor de Wayland. Dentro de este cliente Weston puede ejecutar Xwayland con aplicaciones X. Con x11docker:x11docker --weston-xwayland imagename application
mviereck

1
@Shn También puede ejecutar directamente Xwayland como cliente Wayland: Xwayland :20 & sleep 3 && docker run -e DISPLAY=:20 -v /tmp/.X11-unix:/tmp/.X11-unix imagename application. Xwayland cubrirá toda la pantalla; puedes moverlo con <Super> <LeftMouseButton>. Con x11docker: x11docker --xwayland imagename application.
mviereck

1
@ShN Necesitas un servidor X en cualquier caso. Para evitar X en el host, proporciono x11docker / xwayland . Si algún día se xpratransfiere a GTK3 + python3 , proporcionará más posibilidades con ventanas integradas . Las configuraciones invisibles son posibles con el Xvfbcontenedor. Para una discusión detallada, puede abrir un ticket de problema en github .
mviereck

0

Recomiendo Sommelier de Google. Le permite iniciar aplicaciones Wayland OR X11 y proporciona los sockets que esas aplicaciones están buscando para ingresarlas en el servidor de visualización actual. https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

Un procedimiento simple que debería funcionar en cualquier sistema, no solo Crouton / Crostini en ChromeOS.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.