Python cv2.imshow()无法正常工作:无法连接到X服务器

时间:2019-11-18 20:23:23

标签: python docker opencv terminal centos

情况:在Windows主机上的Docker容器中运行CentOS终端。安装了cv2,工作正常。 脚本:

import sys
import cv2
def main(argv):
        inputfile = ''
        for arg in argv:
                img = cv2.imread(arg)
                cv2.imshow('Image', img)
                cv2.waitkey(0)
if __name__ == "__main__":
        main(sys.argv[1:])

错误:: cannot connect to X server
尝试过的解决方案:
[root@b26030f33e65 PythonScripts]# xhost local:root xhost: unable to open display ""

2 个答案:

答案 0 :(得分:0)

在类似Unix的系统上,您可以通过设置一组必需的挂载(请参阅this article for an idea)将主机的X服务器(如果有)传递到Docker容器。

由于您使用的是Windows,因此由于Windows不运行X服务器,几乎没有机会将X从主机传递到容器。它使用其他系统进行屏幕渲染。

我认为对您来说,唯一可能的解决方案是将目录从主机装载到容器,然后将映像写入该目录中的文件。然后可以从主机系统轻松访问它。

只需使用类似于以下内容的参数运行容器:

docker run
  --rm -ti
  --volume /path/to/host/directory:/path/to/container/directory:rw
  --entrypoint=/bin/bash
  yourcentosimagename

答案 1 :(得分:0)

对于Windows,您可以尝试各种Xserver实现之一,最简单的是VcXsrv,Cygwin领域还提供了其他实现,并且还提供了一些商业解决方案。

主要思想是启动Xserver,使其在所有接口上侦听TCP,并且无需任何身份验证,然后通过TCP从容器连接到它

inside_container > export DISPLAY="<some ip>:0"
inside_container > # start your whatever

注意:在所有接口上监听并且不使用auth是不安全的,您应该仅在开始时使用它,直到事情开始运行,然后再采取必要的步骤来减少“暴露的表面”。

现在...我不太确定如何使您的IP对容器可见,但是我希望这足以使您入门。

以后的修改: 我找到了this(过于复杂)的分步指南,该指南基本上说了差不多的东西:

  • 安装VcXsrv(或Xming或其他)
  • 开始于:
    • “多个窗口”带来更流畅的体验
    • “没有客户”
    • “禁用访问控制”(再次避免最初的麻烦)
  • 每当需要运行某些GUI应用程序时,添加一个指向您的“显示器”的DISPLAY env变量
# example
> docker run -ti --rm -e DISPLAY=172.17.0.1:0.0 firefox
> docker run -ti --rm -e DISPLAY=172.17.0.1:0.0 /bin/sh
# where "172.17.0.1" would be 1 of your IPs