当本地docker会话工作正常时,如何通过SSH连接到docker image而没有matplotlib错误的“ Invalid DISPLAY variable”错误?

时间:2018-11-07 14:16:42

标签: python docker matplotlib ssh

我在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服务器转发给docker。

1 个答案:

答案 0 :(得分:1)

此解决方案是一种解决方法,需要具有活动X服务器的登录用户。这不是最佳选择。

在SSH连接期间,假定的DISPLAY丢失。要将其用于matplotlib,我们必须执行以下操作:

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

export DISPLAY=:1

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