我正在关注如何在 docker 容器中运行 X11 应用程序的示例。我在 Ubuntu 20.04 上并使用 X11:
$ echo $XDG_SESSION_TYPE
x11
我的Dockerfile
:
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y x11-apps
ARG user=hakon
ARG home=/home/$user
RUN groupadd -g 1000 $user
RUN useradd -d $home -s /bin/bash -m $user -u 1000 -g 1000 \
&& echo $user:ubuntu | chpasswd \
&& adduser $user sudo
WORKDIR $home
USER $user
ENV HOME $home
COPY entrypoint.sh .
ENTRYPOINT ["./entrypoint.sh"]
哪里entrypoint.sh
是:
echo "DISPLAY=$DISPLAY"
xclock # <-- This is the X11 application I am testing with. It shows a clock in a Window
echo "Done."
exec bash
我使用以下方法构建图像:
$ docker build -t gui-test-ubuntu-2004 .
然后运行容器:
$ docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
-h $HOSTNAME -v $HOME/.Xauthority:/home/hakon/.Xauthority gui-test-ubuntu-2004
输出是:
DISPLAY=:0
Error: Can't open display: :0
Done.
并且xclock
gui 窗口没有显示。我在这里想念什么?
问题很可能是您
docker
使用snap
. 根据x11dockermviereck
的维护者一种解决方法是使用
Xephyr X server
withx11docker
。而不是运行docker run ... gui-test-ubuntu-2004
,使用:第二种选择是删除
snap
安装docker
,看到这个答案,然后重新docker
安装apt-get install
:删除泊坞窗:
转到https://download.docker.com/linux/ubuntu/dists/并选择您的 Ubuntu 版本,然后浏览
pool/stable/
并下载 3 个.deb
文件:containerd.io_1.2.13-2_amd64.deb
docker-ce_19.03.11_3-0_ubuntu-focal_amd64.deb
docker-ce-cli_19.03.11_3-0_ubuntu-focal_amd64.deb
按以下顺序安装它们:
将您的用户添加到 docker 组以避免必须键入
sudo
才能运行docker
:此时重新启动计算机以激活新的用户和组设置
通过运行测试 docker 安装:
您现在应该能够运行原始
docker run
命令:xhost + local:docker
在运行 docker 之前输入。我正在对此进行测试,但它引发了错误。
standard_init_linux.go:228: exec user process caused: exec format error
我的 docker 是按照此处的说明安装的:https ://docs.docker.com/engine/install/ubuntu/
我在entrypoint.sh
#!/bin/bash
的第一行添加了它,它对我有用。