NVIDIAが入っているPCにおいてdocker上でopenGLなプログラムを起動して手元で見る.nvidia-dockerのversion1と2の両方に対応.


nvidia-dockerのversion xeyes glxgears
ver 1
ver 2

docker上でGUIを起動して手元で確認したいときにハマった+最小限構成で動くやり方が見当たらなかったのでメモ.

OpenGLが入ってくるか来ないかで話は変わる.
また,NVIDIAがインストールされていないPCであれば簡単だったらしい.

TL;DR

nvidia-dockerのversionが2の場合

Dockerfile
FROM ubuntu:18.04

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

# install GLX-Gears
RUN apt update && apt install -y --no-install-recommends mesa-utils x11-apps && rm -rf /var/lib/apt/lists/*

nvidia-dockerのversionが1の場合

Dockerfile
FROM ubuntu:18.04

LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}

RUN apt-get update && apt-get install -y --no-install-recommends mesa-utils x11-apps \
&& rm -rf /var/lib/apt/lists/*
xhost +
sudo docker build -t gl_test .

# nvidia-dockerがversion 1の場合
# nvidia-docker run --rm -it --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" gl_test glxgears

# nvidia-dockerがversion 2の場合
docker run --runtime=nvidia --rm -it --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" gl_test glxgears

これでOK.
nvidia-dockerというのを使うらしい.


以下詳細

2018/09/26 追記

nvidia-dockerのversionが1か2かで大分話が変わってしまう+最近移行期なので,version1を入れている人もいれば2を入れている人もいる.知らないと結構ハマる.2がオススメ.
2だとvolumeとかがなくなる.

2のインストール方法および1が入っている環境から2に移行する方法は

に載っている.

xeyesだけなら簡単

これはnvidia-dockerは要らなくて,普段と変わって必要なことは

という変更だけでOK.
Dockerfileも至って普通で良くて

Dockerfile
FROM ubuntu:18.04

RUN apt-get update && apt-get install -y --no-install-recommends mesa-utils x11-apps && rm -rf /var/lib/apt/lists/*

でOK

glxgearsが難しかった

xeyesのときみたくやろうとすると,

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Error: couldn't get an RGB, Double-buffered visual

と怒られてしまう.

ググるといろいろ出てくるが,どれも上手く行かず,ようやくたどり着いたROS wikiが正解だった.

xeyesのときと比べて,

  • nvidia-dockerを使う必要がある
  • Dockerfileに以下の3行が必要
LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}

という2つの変更が必要だった.
nvidia-dockerを使うと,/usr/local/nvidia/libなどがコンテナ内に出来上がって,それをPATHLD_LIBRARY_PATHに追加してあげる必要があった.
ただし,これはnvidia-dockerのversionが1の場合に限る.

nvidia-dockerのversionが2の場合は

  • nvidia-dockerではなくてdocker run --runtime=nvidiaとする
  • 以下の2行を追加する.
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
docker run --runtime=nvidia --rm -it --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" gl_test_v2 glxgears

でnvidia-docker version 2で動く.

nvidia-dockerをdocker-composeから使う

http://tech.wonderpla.net/entry/2017/11/14/110000 が詳しい

docker-compose.yml
version: '3'
services:
  aho:
    command: /bin/bash
    build:
      context: ./
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - nvidia_driver_396.37:/usr/local/nvidia:ro
    devices:
      - /dev/nvidiactl
      - /dev/nvidia-uvm
      - /dev/nvidia0
volumes:
  nvidia_driver_396.37:
    external: true

docker-compose run --rm ahoでOK

ただしこれはnvidia-dockerのversionが1の場合で,
2の場合は以下になる.だいぶシンプルになった.

docker-compose.yml
version: '2.3'
services:
    aho:
      command: /bin/bash
      build:
        context: ./
        dockerfile: Dockerfile
      runtime: nvidia
      environment:
        - DISPLAY=${DISPLAY}
      volumes:
        - /tmp/.X11-unix:/tmp/.X11-unix