Как я могу запустить графическое приложение в контейнере под Wayland?

15

Когда я использовал рабочий стол X11, я мог запускать графические приложения в Docker-контейнерах, разделяя $DISPLAYпеременную и /tmp/X11-unixкаталог. Например:

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

Сейчас я нахожусь на Fedora 25 под управлением Wayland, поэтому нет инфраструктуры X11 для совместного использования с контейнером. Как я могу запустить графическое приложение в контейнере и показать его на моем рабочем столе? Есть ли какой-нибудь способ завязать в XWayland?

Вилли Баллентхин
источник
Не уверен, как правильно ответить на ваш вопрос (я никогда раньше этого не делал), но в моей системе сокет домена unix, используемый Wayland, используется /run/user/1000/wayland-0для моего персонального компьютера.
Братчли

Ответы:

16

Поскольку вы говорите, что используете Fedora 25 с Wayland, я предполагаю, что вы используете рабочий стол Gnome-Wayland.

Gnome-Wayland запускает Xwayland для поддержки приложений X. Вы можете делиться доступом к Xwayland, как и раньше, с Xorg.

Ваш пример команды отсутствует XAUTHORITY, и вы не упоминаете xhost. Вам нужен один из этих способов, чтобы разрешить приложениям X в Docker доступ к Xwayland (или любому X). Поскольку все это не связано с Wayland, я имею в виду Как вы можете запускать приложения с графическим интерфейсом в Docker-контейнере? о том, как запускать приложения X в докере.

Если коротко, два решения с xhost:

  1. Разрешите локальному пользователю доступ через xhost: xhost +SI:localuser:$(id -un)и создайте аналогичного пользователя с опцией запуска Docker :--user=$(id -u):$(id -g)
  2. Не рекомендуется: Разрешить root-доступ к X с xhost +SI:localuser:root

Связанный подводный камень : X обычно использует разделяемую память (расширение X MIT-SHM). Контейнеры Docker изолированы и не могут получить доступ к общей памяти. Это может привести к сбоям рендеринга и сбоям доступа к ОЗУ. Вы можете избежать этого с помощью опции запуска Docker --ipc=host. Это влияет на изоляцию контейнера, поскольку отключает пространство имен IPC. Сравните: https://github.com/jessfraz/dockerfiles/issues/359


Для запуска Wayland- приложений в Docker без X вам нужен работающий Wayland-композитор, такой как Gnome-Wayland или Weston. Вы должны поделиться гнездом Wayland. Вы найдете его, XDG_RUNTIME_DIRи его имя хранится в WAYLAND_DISPLAY. Поскольку XDG_RUNTIME_DIRдоступ разрешен только его владельцу, вам нужен тот же пользователь в контейнере, что и на хосте. Пример:

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 также должны -e QT_QPA_PLATFORM=waylandи должны запускаться сimagename dbus-launch waylandapplication


x11docker для приложений X и Wayland в Docker - это все в одном решении. Он также заботится о сохранении изоляции контейнера (которая теряется, если просто использовать общий экран X, как в вашем примере).

mviereck
источник
Что если я не уверен, что приложение, которое я хочу запустить, это X или Wayland? Могу ли я передать что-то общее, чтобы оно автоматически определяло, нужен ли XWayland или нет?
Oxwivi
1
@ShN Возможно запустить Weston как клиента в другом компоновщике Wayland. Внутри этого клиента Weston вы можете запускать Xwayland с X-приложениями. С x11docker:x11docker --weston-xwayland imagename application
mviereck
1
@Shn Также вы можете запустить Xwayland непосредственно в качестве клиента Wayland: Xwayland :20 & sleep 3 && docker run -e DISPLAY=:20 -v /tmp/.X11-unix:/tmp/.X11-unix imagename application. Xwayland покроет весь дисплей; Вы можете перемещать его с помощью <Super> <LeftMouseButton>. С x11docker: x11docker --xwayland imagename application.
mviereck
1
@ShN В любом случае вам нужен X-сервер. Чтобы избежать X на хосте, я предоставляю x11docker / xwayland . Если xpraкогда- нибудь будет портирован на GTK3 + python3 , это обеспечит дополнительные возможности с бесшовными окнами. Невидимые настройки возможны Xvfbв контейнере. Для подробного обсуждения вы можете открыть тикет на github .
mviereck
0

Я бы порекомендовал Сомелье от Google. Он позволяет вам запускать приложения Wayland OR X11 и предоставляет сокеты, которые эти приложения ищут, чтобы получить их на текущий сервер дисплея. https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

Простые инструкции должны работать на любой системе, а не только на Crouton / Crostini на ChromeOS.

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

dragon788
источник