2017-09-02 16 views
5

मेरे पास deep नामक डॉकर छवि में पायथन की एक निश्चित सेटिंग है। मैं अजगर कोडमैं डॉकर कंटेनर में matplotlib.pyplot का उपयोग कैसे कर सकता हूं?

docker run --rm -it -v "$PWD":/app -w /app deep python some-code.py 

जानकारी के लिए, -v और -w विकल्पों रहे कंटेनर के लिए वर्तमान पथ में एक स्थानीय फ़ाइल से जोड़ने के लिए चलाने के लिए इस्तेमाल किया।

हालांकि, मैं matplotlib.pyplot का उपयोग नहीं कर सकता। मान लें कि test.py

import matplotlib.pyplot as plt 
plt.plot([1,2], [3,4]) 
plt.show() 

मुझे यह त्रुटि मिली।

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3147, in plot 
    ax = gca() 
File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 928, in gca 
    return gcf().gca(**kwargs) 
File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 578, in gcf 
    return figure() 
File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 527, in figure 
**kwargs) 
File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 84, in new_figure_manager 
    return new_figure_manager_given_figure(num, figure) 
File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 92, in new_figure_manager_given_figure 
    window = Tk.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: no display name and no $DISPLAY environment variable 
समाधान खोज के साथ

, मैं केवल एक ही समाधान हो रहा है। मैं पता लगा रहा bash की शुरूआत उन सभी की अगर

$ xauth list 
xxxx/unix:0 yyyy 5nsk3hd        # copy this list 
$ docker run --rm -it -v "$PWD":/app -w /app \ 
      --net=host -e DISPLAY \ 
      -v /tmp/.X11-unix:/tmp/.X11-unix \ 
      deep bash 

inside-container$ xauth add xxxx/unix:0 yyyy 5nsk3hd # paste the list 
inside-container$ python test.py      # now the plot works!! 

मेरा प्रश्न है क्या कर सकते हैं, बजाय, xauth की स्थापना, और कंटेनर के अंदर अजगर चल रहा है, मैं ऐसे सेटिंग docker run साथ कि मैं सिर्फ चला सकते हैं कर सकते हैं तो कंटेनर के बाहर कोड?

मैं

docker run --rm -it -v "$PWD":/app -w /app \ 
      --net=host -e DISPLAY \ 
      -v /tmp/.X11-unix:/tmp/.X11-unix \ 
      -e "xauth add xxxx/unix:0 yyyy 5nsk3hd" \ 
      deep python test.py 

की कोशिश की --entry पैरामीटर का उपयोग कर, लेकिन यह काम नहीं किया। कृपया मदद करे।

+0

आप आगे प्रदर्शन –

+0

SSH सकता है '-e' वैसे, पर्यावरण चर रहा है। आपका आदेश '--entrypoint' –

उत्तर

5

दिलचस्प बात यह है कि मुझे आरओएस समुदाय में काफी अच्छे और गहन समाधान मिले। http://wiki.ros.org/docker/Tutorials/GUI

मेरी समस्या के लिए, मेरे अंतिम विकल्प ट्यूटोरियल में दूसरा तरीका है:

docker run --rm -it \ 
    --user=$(id -u) \ 
    --env="DISPLAY" \ 
    --workdir=/app \ 
    --volume="$PWD":/app \ 
    --volume="/etc/group:/etc/group:ro" \ 
    --volume="/etc/passwd:/etc/passwd:ro" \ 
    --volume="/etc/shadow:/etc/shadow:ro" \ 
    --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \ 
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ 
    deepaul python test.python 
+0

का उपयोग नहीं कर रहा है मेरे पास एक प्रश्न है: यदि मैं इसे टर्मिनल से सीधे चलाता हूं तो आपका समाधान काम करता है। यदि मैं इसे * .sh फ़ाइल में कॉपी करता हूं और उस फ़ाइल को चलाने का प्रयास करता हूं जिसमें सटीक समान निर्देश होते हैं, यह काम नहीं करता है। तुम जानते हो क्यों? –

संबंधित मुद्दे