Como posso executar uma aplicação gráfica em um container sob o Wayland?

11

Quando usei uma área de trabalho X11, eu poderia executar aplicativos gráficos em contêineres do Docker compartilhando o diretório $DISPLAY variable e /tmp/X11-unix . Por exemplo:

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

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

    
por Willi Ballenthin 14.12.2016 / 16:51

1 resposta

8

Como você diz que está rodando o Fedora 25 com o Wayland, eu suponho que você esteja usando o desktop Gnome-Wayland.

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

Seu comando de exemplo erra XAUTHORITY e você não menciona xhost . Você precisa de uma dessas maneiras para permitir que aplicativos X no docker acessem Xwayland (ou qualquer X). Como tudo isso não está relacionado ao Wayland, eu me refiro a Como você pode executar aplicativos GUI no container docker? sobre como executar aplicativos X no docker.

Como para curtas, duas soluções com xhost:

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

Armadilha : Normalmente, o X usa a memória compartilhada (X extensão MIT-SHM ). Os contêineres do Docker são isolados e não podem acessar a memória compartilhada. Isso pode levar a erros 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 ao desabilitar o namespace do IPC. Compare: link

Para executar aplicativos Wayland no docker sem X, você precisa de um compositor de vias terrestres como o Gnome-Wayland ou o Weston. Você tem que compartilhar o soquete Wayland. Você o encontra em XDG_RUNTIME_DIR e seu nome é armazenado em WAYLAND_DISPLAY . Como XDG_RUNTIME_DIR apenas permite acesso ao seu proprietário, você precisa do mesmo usuário no contêiner que 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

As aplicações QT5 também precisam de -e QT_QPA_PLATFORM=wayland e devem ser iniciadas com imagename dbus-launch waylandapplication

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 é perdido se simplesmente compartilhar o host X como no seu exemplo).

    
por 15.04.2017 / 23:13