2017/02/27

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

「[Docker](https://www.docker.com/) 上で GUI アプリケーションを動かす」という投稿を見つけたので、ちょっとやってみましたDocker でインタラクティブな GUI を動かすのは本来の思想に合ってないという点はとりあえずおいておく。

> 参考
> - [Running GUI apps with Docker – Fábio Rehm](http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/)



ポイントは以下の3点です。
- 実行時に X11 ソケット `/tmp/.X11-unix/` をボリュームとして共有
- user ID, group ID をホストのユーザーと同じにする
- `DISPLAY` 環境変数をホストのユーザーと同じにする

Firefox は重いので、`x11-apps` の時計を表示してみましたどうせ `update` しなければいけないので、結局時間はかかるのだけど…。

### Docker ファイルの用意
以下のような `Dockerfile` を適当なディレクトリに作成。
このとき、`uid`, `gid` がホストユーザーと同じになるようにしますもしくは、ビルド時に指定します。

Dockerfile
```text
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
```

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

```console
`gutter: false;
$ docker build -t gui_test .
```

`uid`, `gid` を指定する場合は以下
```console
`gutter: false;
$ docker build --build-arg uid=1001 --build-arg gid=1001 -t gui_test .
```

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

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

```console
`gutter: false;
$ docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix gui_test /bin/bash
```

### xclock を立ち上げる
```console
`gutter: false;
tester@6cbd2a43f6c6:~$ xclock
```

表示されました。

### ホストとタイムゾーンを揃える GUIとは関係ないですが、Docker 内の時刻は UTC になっているので、表示される時計も UTC のものです。 ホストとタイムゾーンを揃えたい場合は以下のように、`/etc/localtime` を共有します。 ```console `gutter: false; $ docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix -v /etc/localtime:/etc/localtime:ro gcalc /bin/bash ``` > 参考 > - [Dockerでホストと同じタイムゾーンをコンテナ起動時に設定する - Qiita](http://qiita.com/ganta/items/a0f34866c994ebaeef69)

0 件のコメント: