X11デスクトップを使用した場合、$DISPLAY
変数と/tmp/X11-unix
ディレクトリを共有することで、Dockerコンテナーでグラフィカルアプリケーションを実行できました。例えば:
docker run -ti -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix some:ubuntu xclock
現在、ウェイランドを実行しているFedora 25を使用しているため、コンテナーと共有するX11インフラストラクチャはありません。コンテナでグラフィカルアプリケーションを起動してデスクトップに表示するにはどうすればよいですか? XWaylandで結ぶ方法はありますか?
WaylandでFedora 25を実行しているとのことですが、Gnome-Waylandデスクトップを使用していると思います。
Gnome-WaylandはXwaylandを実行してXアプリケーションをサポートします。 Xorgと同じようにXwaylandアクセスを共有できます。
コマンド例ではXAUTHORITY
が欠落しており、xhost
については言及していません。 dockerのXアプリケーションがXwayland(または任意のX)にアクセスできるようにするには、この方法のいずれかが必要です。これはすべてウェイランドとは関係がないので、DockerでXアプリケーションを実行する方法について DockerコンテナーでGUIアプリケーションを実行するにはどうすればよいですか? を参照します。
簡単に言うと、xhostを使用した2つのソリューション:
xhost +SI:localuser:$(id -un)
およびdocker runオプションを使用して同様のユーザーを作成:--user=$(id -u):$(id -g)
xhost +SI:localuser:root
を使用してXへのrootアクセスを許可する関連Pitfall:Xは通常、共有メモリを使用します(X拡張MIT-SHM
)。 Dockerコンテナは分離されており、共有メモリにアクセスできません。これにより、グリッチがレンダリングされ、RAMアクセスエラーが発生します。dockerrunオプション--ipc=Host
を使用すると、これを回避できます。IPC =名前空間。比較: https://github.com/jessfraz/dockerfiles/issues/359
XなしのdockerでWaylandアプリケーションを実行するには、Gnome-WaylandやWestonなどの実行中のWaylandコンポジターが必要です。 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
で開始する必要があります
x11dockerfor X and Wayland applications in docker はオールインワンのソリューションです。また、コンテナーの分離を維持することも重要です(例のように単にホストXディスプレイを共有すると失われます)。
ソムリエby Googleをおすすめします。 Wayland OR X11アプリを起動し、それらのアプリが現在のディスプレイサーバーにアクセスするためにそれらのアプリが探しているソケットを提供します。 https://chromium.googlesource .com/chromiumos/platform2/+/master/vm_tools/sommelier /
ChromeOSのCrouton/Crostiniだけでなく、どのシステムでも機能する簡単なハウツー。
https://github.com/dnschneid/crouton/wiki/Sommelier-(A-more-native-alternative-to-xiwi)