2017/02/27

Docker で GUI アプリケーションを実行する方法

Docker 上で GUI アプリケーションを動かす」という投稿を見つけたので、ちょっとやってみました1

参考

ポイントは以下の3点です。

  • 実行時に X11 ソケット /tmp/.X11-unix/ をボリュームとして共有
  • user ID, group ID をホストのユーザーと同じにする
  • DISPLAY 環境変数をホストのユーザーと同じにする

Firefox は重いので、x11-apps の時計を表示してみました2

Docker ファイルの用意

以下のような Dockerfile を適当なディレクトリに作成。 このとき、uid, gid がホストユーザーと同じになるようにします3

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM ubuntu:16.04
 
RUN apt-get update && apt-get install -y x11-apps
 
# Replace 1000 with your user / group id
ARG uid=1000
ARG gid=1000
RUN groupadd -g ${uid} tester && \
    useradd -u ${gid} -g tester -r tester && \
    mkdir /home/tester && \
    chown ${uid}:${gid} -R /home/tester
 
USER tester
WORKDIR /home/tester

ビルド

ビルドしてイメージを作成

$ docker build -t gui_test .

uid, gid を指定する場合は以下

$ docker build --build-arg uid=1001 --build-arg gid=1001 -t gui_test .

コンテナの実行

実行時に -e, -v オプションで環境変数 DISPLAY と X11 ソケットを適切に設定する必要があります。

以下ではインタラクティブシェルを起動していますが、直接 xclock を起動することも可能です。

$ docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix gui_test /bin/bash

xclock を立ち上げる

tester@6cbd2a43f6c6:~$ xclock

表示されました。

ホストとタイムゾーンを揃える

GUIとは関係ないですが、Docker 内の時刻は UTC になっているので、表示される時計も UTC のものです。 ホストとタイムゾーンを揃えたい場合は以下のように、/etc/localtime を共有します。

$ docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix -v /etc/localtime:/etc/localtime:ro gcalc /bin/bash

参考

  1. Docker でインタラクティブな GUI を動かすのは本来の思想に合ってないという点はとりあえずおいておく 
  2. どうせ update しなければいけないので、結局時間はかかるのだけど… 
  3. もしくは、ビルド時に指定します 
?

0 件のコメント: