前提・実現したいこと
ローカルで作成したKivyアプリをDocker上に移植することを考えています。
開発環境を記します。
(ホストPC)
- Ubuntu:18.04
- Python:3.6.9
- docker:19.03.6 ※nvidia-dockerは未インストール
- NVIDIA-SMI:440.100
- CUDA:10.2
(Dockerコンテナ)
- Ubuntu:20.04
- Python:3.6.9
ググって試してみましたが、エラーが解決できずに手が止まってしまいました。
試したこと
以下のコマンドを実行してコンテナを起動しました。
docker run --privileged --net host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp.X11-unix -it -v /(作成したkivyプログラムのパス)/:/home/ (イメージID)
コンテナ起動後、コンテナ内のhomeディレクトリに移動してkivyプログラムmain.py
を実行しました。
すると以下のようなエラーが出ます。
root@xxx:/home# python3.6 main.py [WARNING] [Config ] Older configuration version detected (0 instead of 21) [WARNING] [Config ] Upgrading configuration in progress. [INFO ] [Logger ] Record log in /root/.kivy/logs/kivy_20-07-16_0.txt [INFO ] [Kivy ] v1.11.1 [INFO ] [Kivy ] Installed at "/usr/local/lib/python3.6/site-packages/kivy/__init__.py" [INFO ] [Python ] v3.6.9 (default, Jul 15 2020, 09:01:41) [GCC 9.3.0] [INFO ] [Python ] Interpreter at "/usr/local/bin/python3.6" [INFO ] [Factory ] 184 symbols loaded [INFO ] [ImageLoaderFFPy] Using ffpyplayer 4.3.1 [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_ffpyplayer, img_gif (img_pil ignored) [INFO ] [Text ] Provider: sdl2 [INFO ] [Window ] Provider: sdl2(['window_egl_rpi'] ignored) libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast X Error of failed request: GLXBadContext Major opcode of failed request: 154 (GLX) Minor opcode of failed request: 6 (X_GLXIsDirect) Serial number of failed request: 92 Current serial number in output stream: 91
このエラーについて調べたところ、NVIDIA Driverを入れると
「libGL.so.1がmesaとnvidiaの両方によって提供されるあいまいなlibGLを指すことがあります」
と書かれてあるサイトがあったので、以下のコマンドをホストPCで実行して確かめました。
root@xxx# ldconfig -p | grep -i gl.so libwayland-egl.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libwayland-egl.so.1 libcogl.so.20 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcogl.so.20 libGL.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libGL.so.1 libGL.so.1 (libc6) => /usr/lib/i386-linux-gnu/libGL.so.1 libEGL.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libEGL.so.1
たしかにlibGL.so.1
が2つあったので、片方を削除して再度確認しました。
rm /usr/lib/i386-linux-gnu/libGL.so.1 root@xxx# ldconfig -p | grep -i gl.so libwayland-egl.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libwayland-egl.so.1 libcogl.so.20 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcogl.so.20 libGL.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libGL.so.1 libGL.so.1 (libc6) => /usr/lib/i386-linux-gnu/libGL.so.1 libEGL.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libEGL.so.1
変わってない。。。
このKivy実行時のエラーについて他にも調べてみましたが、いまいち有効な手段が見つかりませんでした。
解決手段をご存じの方がいらっしゃいましたらご教授いただけますと幸いです。
補足1(2020/07/16)
いくつかのサイトで「xtermが開ければ準備OK!」と書かれてあったので確かめました。
コンテナ内にapt install -y xterm
でインストール後、xterm
を実行すると
xtermのターミナルを開くことは出来ました。
しかしKivyは実行できず。
追加(2020/07/17)
docker19.03以降はGPUにネイティブ対応しているらしい。
もしかしたらGPUを使おうとしているのでは?と考えてホストPCにnvidia-container-toolkit
をインストール。
再起動後に以下コマンドを実行してみるとエラー内容が変わっていました。
root@xxx# docker run --gpus 1 --privileged --net host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp.X11-unix -it -v /(Kivyプログラム保管場所)/:/home/ (イメージID) root@xxx:/home# export NVIDIA_DRIVER_CAPABILITIES=graphics root@xxx:/home# python3.6 main.py [WARNING] [Config ] Older configuration version detected (0 instead of 21) [WARNING] [Config ] Upgrading configuration in progress. [INFO ] [Logger ] Record log in /root/.kivy/logs/kivy_20-07-17_0.txt [INFO ] [Kivy ] v1.11.1 [INFO ] [Kivy ] Installed at "/usr/local/lib/python3.6/site-packages/kivy/__init__.py" [INFO ] [Python ] v3.6.9 (default, Jul 16 2020, 08:54:06) [GCC 9.3.0] [INFO ] [Python ] Interpreter at "/usr/local/bin/python3.6" [INFO ] [Factory ] 184 symbols loaded [INFO ] [ImageLoaderFFPy] Using ffpyplayer 4.3.1 [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_ffpyplayer, img_gif (img_pil ignored) [INFO ] [Text ] Provider: sdl2 [INFO ] [Window ] Provider: sdl2(['window_egl_rpi'] ignored) No protocol specified [INFO ] [Window ] Provider: x11(['window_egl_rpi', 'window_sdl2'] ignored) No protocol specified Couldn't connect to X server
Xtermは実行できるか確認すると以下のエラー
root@xxx:/home# xterm No protocol specified Warning: This program is an suid-root program or is being run by the root user. The full text of the error or warning message cannot be safely formatted in this environment. You may get a more descriptive message by running the program as a non-root user or by removing the suid bit on the executable. xterm: Xt error: Can't open display: %s
実行できなくなっていました。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。