LoginSignup
25

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-14
nvidia-dockerのversion xeyes glxgears
ver 1 image.png image.png
ver 2 image.png image.png

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

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
25