【问题标题】:How do I connect via SSH to docker image without "Invalid DISPLAY variable"-error by matplotlib when local docker session works fine?当本地 docker 会话正常工作时,如何通过 SSH 连接到 docker 映像而没有 matplotlib 的“无效的 DISPLAY 变量”错误?
【发布时间】:2019-04-10 23:43:08
【问题描述】:

我在我的 Ubuntu 18.04 linux 机器上运行/托管了一个完整工作的 docker-image。但是,通过 PowerShell 从我的 Win10 笔记本电脑通过 SSH 连接到物理机:

ssh username@machine

当我尝试通过 ssh 远程执行我的代码时,我确实从 matplotlib 收到以下错误:

Traceback (most recent call last):
  File "foo", line 284, in <module>
    cnnTrainTestApply.applyStructureDetectionNet(absPathToCsvFiles, absPathToCnnOutputFiles)
  File "/home/dev/foo.py", line 702, in bar
    plt.figure(figsize=(15, 15))
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/pyplot.py", line 539, in figure
    **kwargs)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 171, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 177, in new_figure_manager_given_figure
    canvas = cls.FigureCanvas(figure)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backends/backend_qt5agg.py", line 35, in __init__
    super(FigureCanvasQTAggBase, self).__init__(figure=figure)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backends/backend_qt5.py", line 235, in __init__
    _create_qApp()
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backends/backend_qt5.py", line 122, in _create_qApp
    raise RuntimeError('Invalid DISPLAY variable')
RuntimeError: Invalid DISPLAY variable

无论是这个还是ssh -X username@machine 都不会成功。在没有 ssh 的情况下直接在我的机器上工作不会产生任何问题。我想这是缺少运行的 XServer 或类似的东西。

我对 ssh 连接有什么误解?我该如何解决这个问题?

由于 matplotlib 需要正常运行的 qt5 后端,我不能简单地避免将主机系统的 X-server 转发到 docker。

【问题讨论】:

  • 这不是那个问题的重复。因为我的问题不在于将 X11 转发给 docker,所以效果很好。这是关于不在运行 docker 的主机上运行 X-Server。当没有东西可以转发时,你不能转发。谢谢你的链接!它提供了一些见解。更具体地说,docker 使用的 qt5 后端需要运行 Xserver。目前还不能绕过 X-Server 转发。

标签: python docker matplotlib ssh


【解决方案1】:

此解决方案是一种解决方法,它需要具有活动 X-Server 的登录用户。这不是最优的。

假设在 SSH 连接期间缺少 DISPLAY。要将它与 matplotlib 一起使用,我们必须执行以下操作:

ssh 登录后,在主机系统“机器”上输入以下命令,然后再连接到 docker 映像。

export DISPLAY=:1

这可能取决于您的机器设置,只要您的 X-Server 与当前用户一起运行,您可能必须将 echo $DISPLAY 的输出而不是 1 作为导出。只要提供相同的用户名,这应该可以工作。

【讨论】:

  • 我认为在过去一个月左右的时间里至少有两个类似的问题。如果您关心,您可以搜索它们并将它们链接到您的解决方案(或建议标记为重复)。
  • 哦,我一直在寻找我的问题,但没有发现任何真正相似的东西。我也不完全满意我的回答。如果您不介意,可以给我发相应的链接。无论如何,很抱歉问了一个多余的问题!
  • 我也没有找到,所以在这里提一下。据我所知,您的解决方案似乎至少比那些低于这些的任何 cmets 都要好得多;所以这更像是为这些用户提供的服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2021-01-02
  • 2021-06-04
  • 2021-04-09
  • 1970-01-01
  • 2020-09-15
  • 2019-04-10
相关资源
最近更新 更多