ハマったのでメモ。
上の方法で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 # 実行コマンドを指定