如何在 Wayland 下的容器中執行圖形應用程序?
當我使用 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的兩種解決方案:
- 允許您的本地使用者通過 xhost: 訪問
xhost +SI:localuser:$(id -un)
並使用 docker run 選項創建一個類似的使用者:--user=$(id -u):$(id -g)
- 不鼓勵:允許 root 訪問 X
xhost +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 顯示,則會失去)。