อย่างที่คุณบอกว่าคุณกำลังใช้งาน Fedora 25 กับ Wayland ฉันคิดว่าคุณกำลังใช้เดสก์ท็อป Gnome-Wayland
Gnome-Wayland รัน Xwayland เพื่อรองรับ X applications คุณสามารถแบ่งปันการเข้าถึงXwaylandอย่างที่คุณเคยทำกับ Xorg
พลาดท่าตัวอย่างเช่นคำสั่งของคุณและคุณไม่ได้กล่าวถึงXAUTHORITY
xhost
คุณต้องใช้วิธีนี้อย่างใดอย่างหนึ่งเพื่ออนุญาตให้แอปพลิเคชัน X ในนักเทียบท่าเข้าถึง Xwayland (หรือ X ใด ๆ ) เนื่องจากทั้งหมดนี้ไม่เกี่ยวข้องกับ Wayland ฉันหมายถึงคุณจะเรียกใช้แอปพลิเคชัน GUI ในคอนเทนเนอร์นักเทียบท่าได้อย่างไร เกี่ยวกับวิธีเรียกใช้แอปพลิเคชัน X ในตัวเทียบท่า
สำหรับสั้น ๆ โซลูชันสองตัวที่มี xhost:
- อนุญาตให้ผู้ใช้ในพื้นที่ของคุณเข้าถึงผ่าน xhost:
xhost +SI:localuser:$(id -un)
และสร้างผู้ใช้ที่คล้ายกับตัวเลือกการเรียกใช้นักเทียบท่า:--user=$(id -u):$(id -g)
- ท้อแท้: อนุญาตการเข้าถึงรูท X ด้วย
xhost +SI:localuser:root
ที่เกี่ยวข้องหลุมพราง : X หน่วยความจำปกติใช้ร่วมกัน (ส่วนขยาย X MIT-SHM
) คอนเทนเนอร์นักเทียบท่าถูกแยกออกและไม่สามารถเข้าถึงหน่วยความจำที่ใช้ร่วมกันได้ ที่สามารถนำไปสู่การแสดงผลบกพร่องและการเข้าถึง RAM ล้มเหลว --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 ในตัวเชื่อมต่อเป็นโซลูชันครบวงจรในหนึ่งเดียว นอกจากนี้ยังให้ความสำคัญกับการรักษาการแยกตู้คอนเทนเนอร์ (ซึ่งจะหายไปหากแชร์โฮสต์ X display ในตัวอย่างของคุณ)
/run/user/1000/wayland-0
สำหรับเดสก์ท็อปส่วนตัวของฉัน