linux - Docker 容器中 GUI 应用的 X11 转发

标签 linux docker containers dockerfile x11-forwarding

我目前正在尝试在 docker 容器中运行一些 GUI 应用程序。我一直在尝试 jessie frazelle 的那些在 github .但是,我可以构建图像(或从 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

查了很多资料,发现上面的应该可以了,而且大部分人都说run命令中需要以下几行,

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

但我仍然无法显示窗口。

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

任何帮助将不胜感激。

最佳答案

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

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

    $ xhost +SI:localuser:root

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

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

    $ useradd -u 1000 my_user

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

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

关于linux - Docker 容器中 GUI 应用的 X11 转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42181805/

相关文章:

amazon-web-services - 如何监控 ECS 任务循环?

c++ - QVector 要求默认构造函数的原因是什么?

linux - 为什么 "rm"命令会覆盖bash脚本的显示

node.js - 在docker镜像 Node :7中升级或安装Ghostscript 9.21

mysql - 在 centOS 上安装 mysql 总是返回错误的 root 凭据

docker - 我想使用一些从 ubuntu 到 alpine 的包

node.js - 使用来自 Docker 的 env 变量的 React 连接被拒绝错误

docker - 是否可以缓存多阶段 docker 构建?

linux - 如何在 bash shell 中使用管道?

linux - Shell 脚本 - URL 操作