Como posso executar um aplicativo gráfico em um contêiner no Wayland?

15

Quando usei uma área de trabalho do X11, eu poderia executar aplicativos gráficos em contêineres do docker compartilhando a $DISPLAYvariável e o /tmp/X11-unixdiretório. Por exemplo:

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

Agora, estou no Fedora 25 executando o Wayland, então não há infraestrutura X11 para compartilhar com o contêiner. Como iniciar um aplicativo gráfico no contêiner e exibi-lo na minha área de trabalho? Existe alguma maneira de amarrar no XWayland?

Willi Ballenthin
fonte
Não tenho certeza de como responder à sua pergunta da maneira certa (nunca a fiz antes), mas no meu sistema o soquete de domínio unix usado por Wayland está na /run/user/1000/wayland-0minha área de trabalho pessoal.
Bratchley

Respostas:

16

Como você diz que está executando o Fedora 25 com Wayland, presumo que você esteja usando a área de trabalho do Gnome-Wayland.

O Gnome-Wayland executa o Xwayland para suportar aplicativos X. Você pode compartilhar o acesso ao Xwayland como fez antes com o Xorg.

Seu comando de exemplo falha XAUTHORITYe você não menciona xhost. Você precisa de uma destas maneiras para permitir que aplicativos X na janela de encaixe acessem o Xwayland (ou qualquer outro X). Como tudo isso não está relacionado ao Wayland, refiro-me a Como você pode executar aplicativos GUI no contêiner de docker? sobre como executar aplicativos X na janela de encaixe.

Para resumir, duas soluções com xhost:

  1. Permita o acesso do usuário local via xhost: xhost +SI:localuser:$(id -un)e crie um usuário semelhante com a opção de execução do docker:--user=$(id -u):$(id -g)
  2. Desencorajado: permita acesso root ao X com xhost +SI:localuser:root

Armadilha relacionada : O X normalmente usa memória compartilhada (extensão X MIT-SHM). Os contêineres do Docker são isolados e não podem acessar a memória compartilhada. Isso pode levar a falhas de renderização e falhas no acesso à RAM. Você pode evitar isso com a opção de execução do docker --ipc=host. Isso afeta o isolamento do contêiner, pois desativa o namespace do IPC. Compare: https://github.com/jessfraz/dockerfiles/issues/359


Para executar aplicativos Wayland na janela de encaixe sem o X, você precisa de um compositor de wayland em execução, como Gnome-Wayland ou Weston. Você precisa compartilhar o soquete Wayland. Você o encontra XDG_RUNTIME_DIRe seu nome é armazenado WAYLAND_DISPLAY. Como XDG_RUNTIME_DIRapenas permite acesso ao proprietário, você precisa do mesmo usuário no contêiner e no host. Exemplo:

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

Os aplicativos QT5 também precisam -e QT_QPA_PLATFORM=waylande devem ser iniciados comimagename dbus-launch waylandapplication


O x11docker para aplicativos X e Wayland no docker é uma solução completa. Ele também se preocupa em preservar o isolamento do contêiner (que se perde se simplesmente compartilhar a exibição do host X, como no seu exemplo).

mviereck
fonte
E se eu não tiver certeza se o aplicativo que quero executar é X ou Wayland? Posso passar algo genérico para determinar automaticamente se o XWayland é necessário ou não?
Oxwivi 25/03
1
@ShN É possível executar o Weston como cliente em outro compositor do Wayland. Dentro deste cliente Weston, você pode executar o Xwayland com aplicativos X. Com x11docker:x11docker --weston-xwayland imagename application
mviereck 27/03
1
@Shn Além disso, você pode executar Xwayland diretamente como um cliente Wayland: Xwayland :20 & sleep 3 && docker run -e DISPLAY=:20 -v /tmp/.X11-unix:/tmp/.X11-unix imagename application. Xwayland cobrirá toda a exibição; você pode movê-lo com <Super> <LeftMouseButton>. Com x11docker: x11docker --xwayland imagename application.
Mviereck 27/03
1
@ShN Você precisa de um servidor X em qualquer caso. Para evitar o X no host, forneço x11docker / xwayland . Se xprafor portado para o GTK3 + python3 algum dia, fornecerá outras possibilidades com janelas perfeitas. Configurações invisíveis são possíveis Xvfbno contêiner. Para uma discussão detalhada, você pode abrir um ticket de edição no github .
Mviereck 27/03
0

Eu recomendo o Sommelier do Google. Ele permite que você inicie aplicativos Wayland OR X11 e fornece os soquetes que esses aplicativos estão procurando para levá-los ao servidor de exibição atual. https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

Um simples passo a passo deve funcionar em qualquer sistema, não apenas no Crouton / Crostini no ChromeOS.

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

dragon788
fonte