我正在关注这如何在 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 窗口未显示。我这里遗漏了什么?
答案1
问题很可能是你安装docker
了snap
。根据mviereck
的维护者x11docker
snap
导致几个限制。--hostdisplay
无法工作,因为无法从主机共享 unix 套接字,在这种情况下,X unix 套接字/tmp/.X11-unix
解决方法是Xephyr X server
使用x11docker
。不要运行 ,而是docker run ... gui-test-ubuntu-2004
使用:
x11docker --xephyr gui-test-ubuntu-2004
第二种方法是删除snap
安装docker
,请参阅这回答,然后重新docker
安装apt-get install
:
删除docker:
sudo snap remove docker
去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
按以下顺序安装它们:
sudo apt-get install ./containerd.io_1.2.13-2_amd64.deb sudo apt-get install ./docker-ce-cli_19.03.11_3-0_ubuntu-focal_amd64.deb sudo apt-get install ./docker-ce_19.03.11_3-0_ubuntu-focal_amd64.deb
将您的用户添加到 docker 组以避免必须键入
sudo
运行docker
:sudo addgroup --system docker sudo usermod -a -G docker $USER
此时重新启动计算机以激活新的用户和组设置
通过运行以下命令测试 docker 安装:
docker run hello-world
您现在应该能够运行原始docker run
命令:
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
-h $HOSTNAME -v $HOME/.Xauthority:/home/hakon/.Xauthority gui-test-ubuntu-2004
答案2
xhost + local:docker
运行 docker 之前输入。
答案3
我正在测试这个但它引发了错误。
standard_init_linux.go:228: exec user process caused: exec format error
我的docker是按照这里的说明安装的:https://docs.docker.com/engine/install/ubuntu/
我#!/bin/bash
在你的第一行添加了入口点它对我有用。