メモ
追記:グループの設定を追加
環境はUbuntu 16.04にDocker 1.13.0。基本的に以下のROSのチュートリアルページの「2. The safer way」を参照。
http://wiki.ros.org/docker/Tutorials/GUI [1]
docker run -it \
--user=$USER \
--env="DISPLAY" \ # ホスト側のDISPLAYを設定
--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 # 実行コマンドを指定
X11 unix socketを使うために、環境変数DISPLAYを渡して、/tmp/.X11-unix
をマウント。あと、ホストのユーザーで実行するために、/etc/passwd
などもマウント。
ただ、これだと、自分のdocker バージョンではうまく行かなかった。
[2]より、--user=$(id -u):$(id -g)
で直接UIDとGIDを指定するようにした。追記:所属しているグループすべて追加するには、--group-add
を使う。
また、これで起動するとGUI画面は表示されたがコンソールにX errorほげほげとエラーが出た。[3]を見ると、セキュリティに厳しくなったか何かのようで、とりあえず、環境変数QT_X11_NO_MITSHM=1
を設定すると良い。最終的には
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 # 実行コマンドを指定
ちなみに自分は.bashrc
に以下を追加して楽に上のオプションを指定できるようにしている
export DOCKER_USER="--user=$(id -u):$(id -g) $(for i in $(id -G); do echo -n "--group-add "$i; done) --workdir=/home/$USER --volume=/home/$USER:/home/$USER --volume=/etc/group:/etc/group:ro --volume=/etc/passwd:/etc/passwd:ro --volume=/etc/shadow:/etc/shadow:ro --volume=/etc/sudoers.d:/etc/sudoers.d:ro"
export DOCKER_DISP="$DOCKER_USER --env=DISPLAY=$DISPLAY --volume=/tmp/.X11-unix:/tmp/.X11-unix:rw -e QT_X11_NO_MITSHM=1"
こんな感じ、
docker run -it --rm $DOCKER_DISP osrf/ros:indigo-desktop-full rqt # bash
docker run -it --rm $(echo $DOCKER_DISP) osrf/ros:indigo-desktop-full rqt # zsh
ROSの話だけど、これでコンテナからrvizも起動できた。ROSで環境汚さなくてすむし、違うバージョン共存できる。