我是新的python和我试图建立一个小的应用程序。它需要是一个GUI应用程序,我想容器化它与docker。我得到以下错误,无法找到解决方案
No protocol specified
No protocol specified
Traceback (most recent call last):
File "tkinker.py", line 7, in <module>
tinker = Tk()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1818, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display ":0.0"
它在本地启动,但不会在docker中启动。我的操作系统是Xubuntu。
我已经创建了一个示例应用程序(如下),参见run-test.sh https://github.com/jeremysells/test/tree/master/docker-tkinter
如本文所述,您需要一个X11图形层。
但是因为你已经是在X版本的Ubuntu上了,设置DISPLAY应该就足够了:
export DISPLAY=127.0.0.1:0.0
docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix yourImage
检查XAuthority
在终端输入xhost +
。
docker run --rm
--network=host --privileged
-v /dev:/dev
-e DISPLAY=$DISPLAY
-v /tmp/.X11-unix:/tmp/.X11-unix
-v $HOME/.Xauthority:/root/.Xauthority
-it yourimage
对我有用。xhost +
禁用访问控制。在此之后,客户端可以从任何主机连接。
您必须在容器中设置DISPLAY。您可以将其作为参数添加到docker运行命令中,如下所示:
docker run -ti -e DISPLAY=$DISPLAY blah-image blah-command
DISPLAY应该在运行命令的Xubuntu shell中设置。
从这里的另一个答案中得到启发,并受到其评论的启发,我的探索最终得到了两个可行的解决方案。选一个你喜欢的。
-
xhost local:root && docker -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix your_image
-
xhost local:root && docker -e DISPLAY=$DISPLAY --net=host your_image
如果你只想让它在你当前的屏幕上运行,看起来docker有一些很好的内置DNS的东西:
docker run -ti -e DISPLAY=host.docker.internal:0 appname
对于launch.json
中的vscode,将此添加到配置的末尾。
"env": {
"DISPLAY": "host.docker.internal:0"
}
然后,当然,如果您运行的是windows,您需要像xming这样的东西来接收X11数据包。