web-dev-qa-db-ja.com

DockerコンテナでのGUIアプリのX11転送

現在、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

それでもウィンドウを表示できません。

  1. どうすればこれを機能させることができますか?
  2. 私は根本的に何が欠けていますか?

どんな助けでもいただければ幸いです。

8
David Brough

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プログラムファイル)。

1
Salem