現在、DockerコンテナでいくつかのGUIアプリを実行しようとしています。 jessie frazelle at github で試してみました。ただし、イメージをビルド(またはDockerハブから取得)して、目に見えるエラーなしで実行することはできますが、ウィンドウが表示されません(アプリが表示されません)。
Ubuntu16.04でDockerバージョン1.13.1を実行しています
画像は以下から作成されます:
FROM debian:stretch
MAINTAINER Jessie Frazelle <[email protected]>
RUN apt-get update && apt-get install -y \
libreoffice \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "libreoffice" ]
私が使用している実行コマンドは以下のとおりです。
docker run -d \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /etc/localtime:/etc/localtime \
-e DISPLAY=unix$DISPLAY
-v $HOME/Documents:/root/Documents \
-e GDK_SCALE \
-e GDK_DPI_SCALE \
--name libreoffice \
jess/libreoffice
多くのソースを検索した後、上記が機能するはずであることがわかります。ほとんどの人は、runコマンドで次の行が必要であると言っています。
-v /tmp/.X11-unix:/tmp/.X11-unix
-e DISPLAY=unix$DISPLAY
それでもウィンドウを表示できません。
どんな助けでもいただければ幸いです。
Xサーバーと通信できるようにするには、アプリを実行するユーザーがXサーバーとの通信を許可されている必要があります。したがって、2つの選択肢があると思います。
1)コンテナ内のユーザーがXサーバーに接続できるようにします。コンテナ内でユーザーroot
を使用してアプリを実行する場合は、次を使用できます。
$ xhost +SI:localuser:root
(これがセキュリティに与える影響はわかりませんが、rootはどちらの方法でも接続できるはずです...)
2)ユーザーセッションに一致するユーザーをコンテナーに追加します。ホストシステムで使用しているユーザーのUID = 1000の場合、コンテナー内にダミーユーザーを作成できます。
$ useradd -u 1000 my_user
次に、そのユーザーを使用して、コンテナー内でアプリを実行します。これには、アクセスされたホストを変更する必要はありません(ユーザー1000はすでに接続可能であるため)。
2つのオプションを見ると、ホストシステムを変更する必要がないため、2番目のオプションの方が優れているようです。メインユーザーがUID = 1000に一致しなかった他のシステムでこのコンテナーを使用する必要がある場合は、コンテナーを作成できます。 env varから正しいuidを受け取り、正しいユーザーをセットアップします(useradd + chownプログラムファイル)。