やりたいこと

Dockerコンテナ内で、ホストPCにつながったusbカメラを起動して、その(動)画像を表示したい。

必要条件

  • Docker
  • Nvidia driver
  • Nvidia Docker

これらのインストール方法は省略させていただきます。
なお、以下でご紹介するDockerfileとrunスクリプトはNvidia Docker 1用です。Nvidia Docker 2をお使いの方は適切に修正する必要があります。

ソースコード

ディレクトリ構造

hoge/
 ┣ Dockerfile
 ┗ run.sh

Dockerfile

########## Pull ##########
FROM ros:kinetic
########## uvc_camera ##########
RUN apt-get update && apt-get install -y \
		ros-kinetic-uvc-camera \
		ros-kinetic-image-view && \
	echo "#!/bin/bash \n roscore & \n rosrun uvc_camera uvc_camera_node & \n rosrun image_view image_view image:=image_raw" >> /home/live.sh && \
	chmod +x /home/live.sh
########## nvidia-docker1 hooks ##########
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.sh

#!/bin/bash

xhost +
nvidia-docker run -it --rm \
	--env="DISPLAY" \
	--env="QT_X11_NO_MITSHM=1" \
	--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
	--device=/dev/video0 \
	usb_camera:latest \
	/bin/bash /home/live.sh

使いたいカメラに応じてdeviceのパス(例:/dev/video0)は変更する必要があります。
usbカメラの検出名は以下のコマンドで調べることができます。

$ ls /dev/video*

使い方

イメージのビルド

$ cd (上記のDockerfileがあるディレクトリ)
$ docker build -t usb_camera:latest .

コンテナのラン

($ chmod +x run.sh)
$ ./run.sh

さいごに

Dockerコンテナ内でimage_viewを含むGUIを使う場合は、今回のようにNvidia Dockerを使う必要があるので少し複雑になります。
少しでも参考になれば幸いです。

以上です。


追記

私がDockerの基礎を勉強した本を載せておきます。

Ad.