質問: 問題が発生している環境の情報は以下となります。 ``` Host OS: macOS Mojave 10.14.2 Container OS: Ubuntu 18.04.1 LTS Docker Desktop: 2.0.0.2 Docker Engine: 18.09.1 ``` Dockerのコンテナ上で matplotlib.pyplot のグラフを表示しようとしており、 Python3インタプリタで次のコードを実行しました。 ``` import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.show() ``` plt.show()は特にエラーもなく終了するのですが、グラフが表示されません。 matplotlibの使い方の誤り、あるいはDocker環境による問題かと考えております。 余談ですが、plt.savefig()は成功し、ファイルが保存されます。 詳しい方がおりましたら、ご教授頂けないでしょうか。 どうぞ宜しくお願いいたします。
回答: 残念ながら、自分は詳しくないので的確なアドバイスはできそうにないです。 それでも自分が思いつく関係しそうなものを挙げてみます。ほとんどが「質問者さんへの逆質問」ですが、以下のようなことについてもう少し(質問を編集して)追加情報を加えれば本当に詳しい方から適切なアドバイスが得られるかも知れません。 * OS(ホスト/コンテナ側両方。ディストリビューションやバージョンもできるだけ詳しく) 例: ホスト Windows 10 64bit version ...., コンテナ Ubuntu 18.04LTS * X Window Systemの環境はどうなっているか コンテナOSはLinuxのどれかのディストリビューションだと思うのですが、server editionのようにそもそもX Windowがインストールされてない環境もあるのでは? * X Serverはどこでどのようなものを起動しているか? 多分ホストOS側で稼働させているX Serverへ接続するのだと思います(詳しくないので推測です)。 * コンテナ内のアプリケーションからホストのX Serverへ接続できる環境になっているか Docker X11で少し検索しただけですがそこそこコツがあるようです。質問者さんはそのあたりを疑っておられるようですが「Docker X11」で検索などされたでしょうか? * matplotlibのバックエンドはどうなっているか matplotlibはTcl/TkやGTK+やQtなどいろいろなGUIバックエンド(ミドルウェア的なもの)を介してGUIを実現しています。それは環境設定で切り替えたりプログラムコード上で切り替えたりできますが、それがGUIなしのバックエンド('Agg')になっていると画面には何も出せません。 等々。 余談:質問に書くべき情報について 自分が色々挙げたいくつかはハズレ(既に質問者さんがよくわかっていること)と思いますが、自分にとって情報が少なすぎてどの程度まで意識しておられるかわからないので無暗に挙げました。 ひょっとしたら自分がDockerの経験がないため「普通に環境設定すればすんなりGUIは動くもの」なのかそうでないのかがわかってないからかも知れません。が、ご質問の内容だけでは (A)「え?X11て何?」というレベルの話 (B)「Dockerにそんな設定が必要だったのかそれは知らなかった」というレベルの話 などありえる原因にそこそこ幅がある印象です。わかっている方でも質問に情報を載せ忘れる(あるいは面倒がって載せない)人もままいるようですが、ご質問に情報が少ないとどのあたりまで正しく進めておられるか閲覧者にしぼりこめないことを忘れないでほしいです。自分の印象では(B)に近いように思えますが、いかがでしょう? せっかく質問するならせめて「X11についてはxeyeとかxtermなら動く」といったちょっとした情報でもよいから載せてくれているとずっとわかりやすいと思います。あるいは ・ホストOSはなになにでバージョンはこれこれ ・Dockerはこういうふうに設定した ・X Serverについてはこれこれの記事を参考にそのとおりに設定した ・コンテナOSはDockerのこのURLからこれを落とした ・Pythonの環境設定はこんなふうにやった 等々についていくつかの項目の情報を記載されていれば詳しい方にとってあなたの状況を推測する材料は大分違ってくるでしょう。とにかく他者に相談するにはあなたの状況を相手にいかに的確に把握してもらうかが肝心です。そのために**正確で具体的な情報**をできるだけ書くようにしたほうがよいと思います。Q&Aでも**訊かれてから答えるのではなくなるべく最初から情報を提示する**ことが大事ではないでしょうか。 例えば同僚に「ちょっと相談に乗ってくれない?これこれのことをしているのだけど、ここでこういう問題がおきたんだ。ちょっと詳しく話たいんだけど時間ある?」と相談するようなとき、**まず問題を整理し、伝えるべき肝心な情報をできるだけ用意してから**話しかけるのではありませんか?本サイトでの質問も同じと思います。どちらかといえば離れた場所にいる先輩にメールで技術的な質問をする感覚ぐらいがちょうどいいかも知れませんね。