X11

如何在 Wayland 下的容器中執行圖形應用程序?

  • April 29, 2019

當我使用 X11 桌面時,我可以通過共享$DISPLAY變數和/tmp/X11-unix目錄在 docker 容器中執行圖形應用程序。例如:

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

現在,我在執行 Wayland 的 Fedora 25 上,所以沒有 X11 基礎架構可以與容器共享。如何在容器中啟動圖形應用程序,並讓它顯示在我的桌面上?有什麼方法可以配合 XWayland 嗎?

正如您所說您正在使用 Wayland 執行 Fedora 25,我假設您使用的是 Gnome-Wayland 桌面。

Gnome-Wayland 執行 Xwayland 以支持 X 應用程序。您可以像以前使用 Xorg 一樣共享Xwayland訪問權限。

您的範例命令未命中XAUTHORITY,並且您沒有提及xhost. 您需要其中一種方式來允許 docker 中的 X 應用程序訪問 Xwayland(或任何 X)。由於這一切都與 Wayland 無關,我參考瞭如何在 docker 容器中執行 GUI 應用程序?關於如何在 docker 中執行 X 應用程序。

簡而言之,使用xhost的兩種解決方案:

  1. 允許您的本地使用者通過 xhost: 訪問xhost +SI:localuser:$(id -un)並使用 docker run 選項創建一個類似的使用者:--user=$(id -u):$(id -g)
  2. 不鼓勵:允許 root 訪問 Xxhost +SI:localuser:root

相關陷阱:X 通常使用共享記憶體(X 擴展MIT-SHM)。Docker 容器是隔離的,無法訪問共享記憶體。這可能導致渲染故障和 RAM 訪問失敗。您可以使用 docker run option 避免這種情況--ipc=host。這會影響容器隔離,因為它會禁用 IPC 命名空間。比較:https ://github.com/jessfraz/dockerfiles/issues/359


要在沒有 X 的情況下在 docker 中執行**Wayland應用程序,您需要一個執行的 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用於 docker 中的 X 和 Wayland 應用程序是一個多合一的解決方案。它還關心保持容器隔離(如果只是像您的範例中那樣共享主機 X 顯示,則會失去)。

引用自:https://unix.stackexchange.com/questions/330366