我目前正在尝试在 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
但我仍然无法显示窗口。
- 我怎样才能让它工作?
- 我从根本上缺少什么?
任何帮助将不胜感激。
最佳答案
为了能够与 X 服务器通信,必须允许运行应用程序的用户与 X 服务器通信。所以我认为你有两个选择:
允许容器中的用户连接到 X 服务器。如果您的应用在容器内使用用户
root
运行,则可以使用:$ xhost +SI:localuser:root
(我不知道这对安全性的影响,但 root 应该能够以任何一种方式连接......)
在与您的用户 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/