我正在尝试在 Mac 主机上的 Ubuntu Docker 容器内运行 GUI 应用程序。
我的测试 Dockerfile 标记xterm
为
FROM ubuntu:xenial
RUN apt-get update && apt-get install -y xterm
RUN useradd -ms /bin/bash xterm
USER xterm
WORKDIR /home/xterm
下列的本教程, 我
- 允许来自 XQuartz 的网络客户端的连接
- 开始
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
,打印E connect(5, LEN=4 AF=1 ":0", 4): No such file or directory
。 - 打开 XQuartz
- 运行
docker run -it --rm -e DISPLAY=192.168.178.36:0 --entrypoint /usr/bin/xterm xterm
,其中192.168.178.36
en0 是 IP 地址。此输出/usr/bin/xterm: Xt error: Can't open display: 192.168.178.36:0
,错误在 socat 中第二次出现。没有显示 GUI。
这个错误是什么socat
意思?
系统详细信息:
- Docker Desktop 2.2.1.0,带有 Docker Engine 19.03.05
- MacOS Mojave 版本 10.14.5
答案1
看来 XQuartz X Socket 被命名为/tmp/.X11-unix/X0
,至少该文件在 XQuartz 启动时由 XQuartz 创建,但DISPLAY
变量包含“:0”,因此socat
转发到不存在的套接字。
当我在 socat 命令 ( ) 中使用该文件代替“:0”时socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:/tmp/.X11-unix/X0
,不再出现错误。运行 xterm 容器还会在错误No protocol specified
之前打印Can't open display
。
这是通过身份验证解决的,我运行了xhost +
,最终允许运行xterm
,但这不安全,最好这样做使用 xauth。