LoginSignup
11

More than 5 years have passed since last update.

NVIDIAのグラフィックボードがあるときのOpenGLを使ったGUIをDocker内で起動する

Posted at

ハマったのでメモ。

DockerでGUIのアプリ動かすためのメモ

上の方法でGUIアプリを起動出来るようになったのは良かったが、ホスト側でNVIDIAのグラフィックボードを使っている環境において、OpenGLを使ったアプリ(具体的に今回はRViz)を使うと、libgl error : failed to load driver swrast
的なエラーがでてセグメンテーションフォルトで落ちることがあった。

docker/Tutorials/Hardware Acceleration - ROS Wiki にある通り、nvidia-docker(NVIDIAのカードをDocker内で利用するためのDockerラッパー)を使ってコンテナを起動すると良い。ただし、NVIDIA-Dockerに
NVIDIAのドライバー使うよと教えるために、Dockerイメージを自分でビルドする必要がある。
以下のDockerfileを適切な場所に作成して、

FROM osrf/ros:indigo-desktop-full  # 今回使ったベースイメージ

# NVIDIAドライバ使うことをnvidia-dockerに教える
LABEL com.nvidia.volumes.needed="nvidia_driver"
# NVIDIAのexecutableやlibの場所にパスを通す(今回必要かしらない)
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}

Dockerfileがあるフォルダで、

docker build -t ros:nvidia .  # -t Dockerイメージの名前とタグを適当なものに指定 

これで、nvidia-dockerを使ってコンテナを起動すれば良い。

nvidia-docker run -it \
    --user=$(id -u):$(id -g) \  # ホスト側のUIDとGIDでコンテナを起動
    $(for i in $(id -G); do echo -n " --group-add "$i; done) \  # 所属しているグループを全て設定
    --env=DISPLAY=$DISPLAY \  # ホスト側のDISPLAYを設定
    --env=QT_X11_NO_MITSHM=1 \  # X errorを抑える
    --workdir="/home/$USER" \  # 初期ディレクトリをホストユーザーのホームに設定
    --volume="/home/$USER:/home/$USER" \  # ホストユーザーホームをマウント
    --volume="/etc/group:/etc/group:ro" \  # 以下4つはホスト側のユーザー情報をそのまま使うための設定
    --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" \  # ホスト側のXを使う
    osrf/ros:indigo-desktop-full \  # Dockerコンテナを指定
    rqt  # 実行コマンドを指定

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11