8

我目前正在尝试在 docker 容器中运行一些 GUI 应用程序。我一直在github上尝试jessie frazelle的那些。但是,我可以构建图像(或从 docker hub 获取)并运行它们而不会出现任何可见的错误,但是窗口不显示(我看不到应用程序)。

我在 Ubuntu 16.04 上运行 Docker 版本 1.13.1

图像创建自:

FROM debian:stretch
MAINTAINER Jessie Frazelle <jess@linux.com>

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

在搜索了很多资源之后,我可以看到上面应该可以工作,并且大多数人都说运行命令中需要以下几行,

    -v /tmp/.X11-unix:/tmp/.X11-unix
    -e DISPLAY=unix$DISPLAY

但我仍然无法显示窗口。

  1. 我怎样才能让它工作?
  2. 我从根本上缺少什么?

任何帮助,将不胜感激。

4

1 回答 1

1

为了能够与 X 服务器进行通信,必须允许运行应用程序的用户与 X 服务器进行通信。所以我认为你有两个选择:

  1. 允许容器中的用户连接到 X 服务器。如果您的应用程序root在容器内与用户一起运行,您可以使用:

    $ xhost +SI:localuser:root

(我不知道这对安全性的影响,但 root 应该能够以任何一种方式连接......)

  1. 在与您的用户会话匹配的容器中添加用户。如果您在主机系统中使用的用户的 UID = 1000,您可以在容器内创建一个虚拟用户:

    $ useradd -u 1000 my_user

然后使用该用户在容器内运行您的应用程序。这不需要对接受的主机进行任何更改(因为用户 1000 已经能够连接)。

看这两个选项,第二个似乎更好,因为它不需要对宿主系统进行任何更改,并且如果您需要在主用户无法匹配 UID=1000 的其他系统中使用此容器,则可以使容器从 env var 接收正确的 uid,然后设置正确的用户(useradd + chown 程序文件)。

于 2017-02-11T22:39:51.093 回答