我目前正在尝试在docker容器中运行一些GUI应用程序。我一直在jessie frazelle github处尝试link。但是我可以构建图像(或从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
但我仍然无法显示窗口。
任何帮助都将不胜感激。
答案 0 :(得分:1)
为了能够与X服务器通信,必须允许运行应用程序的用户与X服务器通信。所以我认为你有两个选择:
1)允许容器中的用户连接到X服务器。如果您的应用在容器内使用用户root
运行,则可以使用:
$ xhost +SI:localuser:root
(我不知道这个的安全含义,但root应该能够以任何一种方式连接......)
2)在容器中添加与用户会话匹配的用户。如果您在主机系统中使用的用户具有UID = 1000,则可以在容器内创建虚拟用户:
$ useradd -u 1000 my_user
然后使用该用户在容器内运行您的应用。这不需要对受到攻击的主机进行任何更改(因为用户1000已经能够连接)。
看看这两个选项,第二个似乎更好,因为它不需要在主机系统中进行任何更改,并且如果您需要在主用户无法匹配UID = 1000的其他系统中使用此容器,您可以使容器从env var接收正确的uid,然后设置正确的用户(useradd + chown程序文件)。