我试图了解如何运行一个运行 X11 服务器的 docker 容器,以便在编写一些 python 代码时可以进行可视化,并找到了很多答案。
我发现了很多问题和很多答案,但即使有些提供了解决方案,大多数对于像我这样的新手来说解释也不够标准。所以我无法让它在我的具体情况下工作。
那么有人可以帮我理解为什么这不起作用吗?
$> XSOCK=/tmp/.X11-unix
$> XAUTH=/tmp/.docker.xauth
$> xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
$> sudo docker run --name my_name \
-v $XSOCK:$XSOCK \
-v $XAUTH:$XAUTH \
-e DISPLAY=$DISPLAY \
-e XAUTHORITY=$XAUTH \
-it b9d09a81e708
这是当我尝试使用以下命令创建图形时出现的错误matplotlib
:
In [1]: import matplotlib.pyplot as plt
In [2]: plt.figure()
--------------------------------------------------------------------
TclError Traceback (most recent call last)
...
TclError: couldn't connect to display "localhost:10.0"
这是我目前对这一系列命令的理解:
XSOCK
通过创建一个包含本地计算机上套接字路径的新变量并使用标志挂载它,将本地计算机上现有的 X11 套接字连接到 docker 容器中的套接字-v
。通过在本地计算机上创建一个包含套接字路径的新变量并使用标志挂载它来创建一个新套接字
/tmp/.docker.xauth
(该文件当前不存在)。XAUTH
-v
使用
xauth
命令列出本地计算机上的当前显示(以数字格式),使用该sed
命令更改它们,然后将它们添加回刚刚创建的新套接字文件中。运行 docker 映像并在本地计算机上创建新变量
DISPLAY
和 ,XAUTHORITY
其值为DISPLAY
和。XAUTH
以下是我仍然无法理解的事情:
新创建的socket有什么
/tmp/.docker.xauth
用呢?该命令有什么
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
作用?尤其:A。该
sed
部分的用途是什么?它如何将 的输出更改xauth nlist $DISPLAY
为 的输入xauth -f $XAUTH nmerge -
?b.
-
的末尾是什么xauth -f $XAUTH nmerge -
?这些命令中的任何一个都可以直接在 Dockerfile 内部完成,这样连接到它时就不会产生所有这些开销吗?
谢谢