Sockets 具有共享X11套接字的Docker:为什么它可以;“开始”;容器外的Firefox?
我有以下情况:Sockets 具有共享X11套接字的Docker:为什么它可以;“开始”;容器外的Firefox?,sockets,user-interface,firefox,docker,x11,Sockets,User Interface,Firefox,Docker,X11,我有以下情况: 我设置了一个可以访问X11套接字的Docker容器,基本上我是这样做的: 然后我在容器中安装了Firefox,并在bash中使用“Firefox”命令启动它 我注意到:如果当我在容器中启动Firefox时,Firefox已经在我的主机上运行了,那么它实际上是“逃逸”了容器,因为它刚刚打开了Firefox主机实例的一个新窗口。因此,它可以访问主机上的所有内容,并且容器变得无用 反之亦然:如果Firefox没有在主机上运行,并且我在容器中启动了一个实例,那么它实际上是在容器中运行的。
-new instance
标志启动Firefox,则不会发生这种情况,因此这似乎更像是Firefox的问题,而不是X11套接字的问题
更新2:这似乎也发生在其他场景中,例如使用ssh和X-forwarding:和
现在的问题是,Firefox到底是如何做到这一点的?他们使用什么样的X11巫术来确定Firefox是否已经在运行?因为您将X11套接字转发到容器中,任何图形程序,无论是在容器内部还是容器外部,都将与同一个Xorg服务器进行通信。这与使用ssh和X-forwarding时相同 现在让我们假设一个firefox实例已经启动并与该xserver通信。如果我们是启动的第二个firefox进程,我们可能会从根目录中找到第一个进程。我们可以通过firefox在其窗口上设置的窗口来识别属于firefox的窗口。一旦我们发现一个属于firefox的窗口,我们可能会请求拥有该窗口的进程添加一个新选项卡 也许,如果我们找到这样一个过程,并要求它打开一个新的标签,我们只是死了,因为我们的工作已经完成 当然,我们总是可以发现firefox确实做到了这一点。特别是:
- 然后
- 通过解析命令行
- 然后调用
SendCommandLine()
- 这是一个虚拟函数,所以找到它的覆盖
- 在这里,您可以看到它在哪里调用前两个函数,这两个函数链接到
,然后是FindBestWindow()
李>DoSendCommandLine()