LoginSignup
45
51

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-06

メモ

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

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

45
51
0

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
45
51