情况:在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 ""
答案 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(过于复杂)的分步指南,该指南基本上说了差不多的东西:
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