Help us understand the problem. What is going on with this article?

DockerでGUIのアプリ動かすためのメモ

More than 1 year has passed since last update.

メモ

追記:グループの設定を追加

環境は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で環境汚さなくてすむし、違うバージョン共存できる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away