我试图在一个可以直接访问X11套接字的码头容器中运行嵌套的X服务器Xephyr,但是我遇到了一些奇怪的图形错误,我目前还不明白。
Dockerfile的内容只是
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -qqy xserver-xephyr
# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*用
sudo docker build -t xephyrtest .和运行它
sudo docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix xephyrtest Xephyr :1产出如下:
Xephyr unable to use SHM XImages
Initializing built-in extension Generic Event Extension
Initializing built-in extension SHAPE
Initializing built-in extension MIT-SHM
Initializing built-in extension XInputExtension
Initializing built-in extension XTEST
Initializing built-in extension BIG-REQUESTS
Initializing built-in extension SYNC
Initializing built-in extension XKEYBOARD
Initializing built-in extension XC-MISC
Initializing built-in extension SECURITY
Initializing built-in extension XINERAMA
Initializing built-in extension XFIXES
Initializing built-in extension RENDER
Initializing built-in extension RANDR
Initializing built-in extension COMPOSITE
Initializing built-in extension DAMAGE
Initializing built-in extension MIT-SCREEN-SAVER
Initializing built-in extension DOUBLE-BUFFER
Initializing built-in extension RECORD
Initializing built-in extension DPMS
Initializing built-in extension Present
Initializing built-in extension DRI3
Initializing built-in extension X-Resource
Initializing built-in extension XVideo
Initializing built-in extension XVideo-MotionCompensation
Initializing built-in extension SELinux
Initializing built-in extension GLX
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/Type1, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi, removing from list!在这里,第一行Xephyr unable to use SHM XImages似乎是最重要的,因为它没有出现在Xephyr正常工作的主机上。
虽然Xephyr窗口会弹出,但使用:1显示的应用程序会显示出奇怪的故障。例如,DISPLAY=:1 gedit如下所示(当鼠标在窗口内移动时,输出会迅速变化):

SHM XImages意味着什么?我如何解决容器中的不可用性?
发布于 2015-04-15 19:11:56
实际上,使用命令在docker容器中运行Xephyr非常容易,因为Docker 1.5使用以下命令
sudo docker run -e DISPLAY -v /tmp:/tmp --ipc=host --pid=host xephyrtest Xephyr :1这两个附加参数是
--ipc=host允许容器使用与主机相同的IPC命名空间,因此也可以访问相同的共享内存段。--pid=host允许容器查看(并修改)主机的进程。这是必要的,因为X服务器端口锁定是通过/tmp/.Xi-lock锁文件(用显示端口替换i )完成的,其中包含运行在端口i上的X服务器的pid。您还必须将-v /tmp/.X11-unix:/tmp/.X11-unix更改为-v /tmp:/tmp,以便访问容器内的X11 unix之外的锁文件。
虽然这很好,但是您必须知道,两个额外的参数和对主机的/tmp文件夹的访问会授予容器重要的特权,在某些情况下可能会造成安全风险。
发布于 2016-11-24 22:17:15
使用-extension MIT-SHM选项运行Xephyr以禁用共享内存的使用。然后,您不需要使用docker选项--ipc=host来分解容器隔离。
为了避免docker选项--pid=host,考虑在主机上运行Xephyr,共享它的X套接字并设置-e DISPLAY=:1。只共享套接字文件/tmp/.X11-unix/X1就足够了,不需要共享整个文件夹,甚至共享整个/tmp。
发布于 2015-04-10 09:54:21
MIT扩展是一种允许在客户端和服务器之间更快地显示图像(主要是)的方法,只要它们在同一台计算机上运行。这是通过创建一个SysV shm共享内存对象来实现的,客户端可以将图像数据写入X服务器并让它直接显示,而不必通过套接字序列化图像。
如果码头集装箱阻塞了它,而gedit依赖它,我就不会感到惊讶了。
https://stackoverflow.com/questions/29509868
复制相似问题